MySQL:索引優化實戰技巧

目錄

一、前言

二、基礎知識回顧

三、索引設計優化

1.遵循最左匹配原則,合理設計聯合索引順序

2.利用覆蓋索引避免回表查詢

3.針對字符串列使用前綴索引

4.合理使用復合索引替代多個單列索引

5.使用前綴索引優化模糊查詢的左匹配

四、索引使用優化

1.避免在WHERE子句中對字段進行函數運算

2.避免隱式類型轉換導致索引失效

3.小心使用NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等否定操作符

4.合理使用LIMIT優化分頁查詢

5.避免使用SELECT *,只查詢需要的列

6.使用EXPLAIN分析查詢執行計劃

五、特殊場景索引優化

1.使用索引排序優化ORDER BY操作

2.在大表上創建索引的最佳實踐

3.使用虛擬列為計算結果創建索引

六、索引維護優化

1.定期優化和重建索引

2.控制單表上的索引數量

3.使用降序索引優化排序

4.使用部分索引優化高選擇性數據

七、索引監控與進階技巧

1.利用索引統計信息進行調優

2.使用索引提示(Index Hints)解決優化器選擇問題

八、結語

一、前言

MySQL索引優化是提升數據庫性能的關鍵手段,一個合理的索引設計和使用策略,往往能將查詢速度提升幾十倍甚至上百倍。

然而,索引優化并不簡單,既需要扎實的理論基礎,也需要豐富的實戰經驗。

本文總結了21個MySQL索引優化的實戰技巧,從索引選擇、設計到維護、監控的全生命周期,幫助你解決日常開發中的索引性能問題。

二、基礎知識回顧

在具體介紹前,讓我們先簡單回顧索引的基礎知識:

MySQL常用的索引類型包括:主鍵索引、唯一索引、普通索引、聯合/組合/復合索引、覆蓋索引、全文索引等。

其中最常用的B+樹索引,具有以下特點:

? 非葉子節點只存儲鍵值信息

? 所有葉子節點包含了完整的數據記錄

? 葉子節點通過指針連接,方便范圍查詢

? 所有節點按鍵值大小排序

理解這些基礎對于后續優化至關重要。接下來,讓我們進入正題。

三、索引設計優化

1.遵循最左匹配原則,合理設計聯合索引順序

聯合索引的順序直接影響其使用效率。MySQL會從左到右依次使用索引列,如果中間某列沒有使用,則后面的列也無法使用索引。

錯誤示例:

-- 創建索引(name, age, city)
CREATE INDEX idx_user_name_age_city ON user(name, age, city);-- 以下查詢無法充分利用索引
SELECT * FROM user WHERE age = 25 AND city = 'Beijing'; ?-- name列缺失,只能全表掃描
SELECT * FROM user WHERE name = 'Tom' AND city = 'Beijing'; ?-- 中間age列缺失,city無法使用索引

優化方法:

1. 將選擇性高的列放在前面(選擇性 = 不重復值 / 總記錄數)

2. 將常用于條件查詢的列放在前面

3. 考慮范圍查詢的列放在最后

-- 假設選擇性:city < name < age
CREATE INDEX idx_user_name_age_city ON user(name, age, city);-- 充分利用索引的查詢
SELECT * FROM user WHERE name = 'Tom' AND age = 25;
SELECT * FROM user WHERE name = 'Tom' AND age = 25 AND city = 'Beijing';

(注:最左前綴匹配原則的核心要點:

1.必須包含最左列:?查詢條件中必須包含組合索引定義中的最左邊第一列 (name),否則索引對該查詢無效。

2.連續前綴匹配:?索引可以被用于匹配查詢條件中索引列的連續前綴?((name),?(name,age),?(name, age, city))。

3.不能跳過中間列:?如果查詢條件沒有包含索引定義中某個連續前綴的中間列(例如,只有 name和 city,跳過了 age),那么只有跳過的列之前的列(name)能用于索引查找,跳過的列之后的列(city)不能用于查找,只能作為掃描后的過濾條件。

-- 創建組合索引索引
CREATE INDEX idx_user_name_age_city ON user(name, age, city);-- 充分利用索引的查詢
SELECT * FROM user WHERE name = 'Tom';
SELECT * FROM user WHERE name = 'Tom' AND age = 25 ;
SELECT * FROM user WHERE name = 'Tom' AND age = 25 AND city = 'Beijing';
-- 跳過了索引中定義的age列,只有name是利用了索引,city這里只是作為查詢條件
SELECT * FROM user WHERE name = 'Tom' AND city = 'Beijing';

4.范圍查詢會中斷后續列:如果查詢條件中對某一列使用了范圍查詢 (>,?<,?BETWEEN,?LIKE 'prefix%'),那么索引中位于這個范圍查詢列之后的列無法再用于索引查找,只能作為掃描后的過濾條件。

-- 創建組合索引索引
CREATE INDEX idx_user_name_age_city ON user(name, age, city);-- name列使用范圍查詢,導致age和city列不走這個組合索引(這里name列是走索引的)
SELECT * FROM user WHERE name like 'Tom%' AND age = 25 AND city = 'Beijing';

)

2.利用覆蓋索引避免回表查詢

回表操作是指通過索引找到對應的行記錄指針,再通過指針去查詢完整記錄的過程。

如果查詢只需要返回索引包含的列,則可以避免回表,這稱為覆蓋索引。

優化前:

-- 創建普通索引
CREATE INDEX idx_user_name ON user(name);-- 需要回表查詢
SELECT id, name, age, city FROM user WHERE name = 'Tom';

優化后:

-- 創建包含所需字段的索引
CREATE INDEX idx_user_name_age_city ON user(name, age, city);-- 使用覆蓋索引,無需回表
SELECT name, age, city FROM user WHERE name = 'Tom';

3.針對字符串列使用前綴索引

對于CHAR和VARCHAR類型的列,如果整列長度較大,可以只索引開頭的部分字符,這樣可以大幅減少索引占用空間,提高索引效率。
優化方法:

-- 假設product_desc是較長的產品描述文本
CREATE INDEX idx_product_desc ON product(product_desc(50));

如何確定前綴長度?可以通過計算選擇性來確定:
?

-- 計算不同前綴長度的選擇性
SELECT?COUNT(DISTINCT LEFT(product_desc, 10)) / COUNT(*) AS sel_10,COUNT(DISTINCT LEFT(product_desc, 20)) / COUNT(*) AS sel_20,COUNT(DISTINCT LEFT(product_desc, 30)) / COUNT(*) AS sel_30,COUNT(DISTINCT LEFT(product_desc, 40)) / COUNT(*) AS sel_40,COUNT(DISTINCT LEFT(product_desc, 50)) / COUNT(*) AS sel_50,COUNT(DISTINCT product_desc) / COUNT(*) AS sel_full
FROM product;

創建索引時,選擇一個接近完整列選擇性的前綴長度即可。
注意事項:?使用前綴索引后,無法使用該索引做ORDER BY或GROUP BY,也無法使用覆蓋索引。

4.合理使用復合索引替代多個單列索引

多個單列索引在多條件查詢時,MySQL只會選擇一個索引。而復合索引可以同時滿足多個條件的查詢需求。

優化前:

-- 單獨創建兩個索引
CREATE INDEX idx_user_age ON user(age);
CREATE INDEX idx_user_city ON user(city);-- MySQL通常只會選擇一個索引
SELECT * FROM user WHERE age = 25 AND city = 'Beijing';

優化后:

-- 創建一個復合索引
CREATE INDEX idx_user_age_city ON user(age, city);-- 可以同時使用age和city條件
SELECT * FROM user WHERE age = 25 AND city = 'Beijing';

5.使用前綴索引優化模糊查詢的左匹配

LIKE語句使用通配符前綴(如'%abc')會導致索引失效。但對于右匹配模式(如'abc%'),索引仍然有效。

?可以使用索引的查詢:

-- 可以使用索引
SELECT * FROM products WHERE product_name LIKE 'iphone%';

無法使用索引的查詢:

-- 無法使用索引
SELECT * FROM products WHERE product_name LIKE '%iphone%';

優化方法:

對于需要搜索包含某個關鍵詞的記錄,可以考慮全文索引或搜索引擎。對于簡單場景,也可以通過字段冗余解決:

-- 添加一個反轉字段
ALTER TABLE products ADD product_name_reversed VARCHAR(255);-- 創建反轉字段的索引
CREATE INDEX idx_product_name_rev ON products(product_name_reversed);-- 搜索以'phone'結尾的產品
SELECT * FROM products?
WHERE product_name_reversed LIKE CONCAT(REVERSE('phone'), '%');

或者如果你的?MySQL 版本 >= 8.0也可以使用函數索引;

-- 創建字段的函數索引
CREATE INDEX idx_product_name_fun ON products(REVERSE(product_name));-- 搜索以'phone'結尾的產品(這里直接用REVERSE函數反轉字段)
SELECT * FROM products?
WHERE REVERSE(product_name) LIKE CONCAT(REVERSE('phone'), '%');

或者使用全文索引(關鍵字FULLTEXT):

-- 1. 在需要搜索的列上創建全文索引 (以 products 表的 description 列為例)
ALTER TABLE products ADD FULLTEXT INDEX ft_idx_description (description);-- 2. 基礎搜索:查找包含 'phone' 或 'camera' 的記錄 (自然語言模式)
SELECT *, MATCH(description) AGAINST('phone camera') AS relevance
FROM products
WHERE MATCH(description) AGAINST('phone camera')
ORDER BY relevance DESC;-- 3. 布爾搜索:查找必須包含 'fast' 且包含 'charger' 但不包含 'wireless' 的記錄
SELECT *
FROM products
WHERE MATCH(description) AGAINST('+fast +charger -wireless' IN BOOLEAN MODE);-- 4. 短語搜索:查找精確包含 'long battery life' 短語的記錄
SELECT *
FROM products
WHERE MATCH(description) AGAINST('"long battery life"' IN BOOLEAN MODE);

強烈建議:?除非是微不足道的中文搜索需求,否則不要依賴 MySQL 全文索引解決核心中文搜索問題。投入專業搜索引擎 (如 ES/MeiliSearch + 中文分詞) 的回報遠高于在 MySQL 內勉強湊合。

(搜索引擎這里不做贅述,有想了解的同學請關注我后續的文章。)

四、索引使用優化

1.避免在WHERE子句中對字段進行函數運算

?在字段上使用函數會導致索引失效,應該把運算轉移到值上。

錯誤用法:

-- 索引失效
SELECT * FROM orders WHERE YEAR(create_time) = 2023;

優化方法:

-- 可以使用索引
SELECT * FROM orders?
WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01';

2.避免隱式類型轉換導致索引失效

MySQL在進行查詢時,如果字段類型與條件值類型不匹配,會進行隱式類型轉換,可能導致索引失效。

錯誤用法:

-- user_id是varchar類型,但使用了整數條件
CREATE INDEX idx_user_id ON users(user_id);
SELECT * FROM users WHERE user_id = 12345; ?-- 索引可能失效

優化方法:

-- 確保條件值類型與字段類型一致
SELECT * FROM users WHERE user_id = '12345'; ?-- 使用字符串類型

3.小心使用NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等否定操作符

否定條件通常會導致索引失效,因為數據庫需要檢查所有不滿足條件的記錄。
優化方法:

盡量用肯定表達式替代否定表達式:

-- 優化前:無法充分利用索引
SELECT * FROM products WHERE category_id != 5;-- 優化后:可以使用索引
SELECT * FROM products WHERE category_id < 5 OR category_id > 5;

4.合理使用LIMIT優化分頁查詢

大偏移量的LIMIT分頁查詢效率較低,因為MySQL需要檢索前N條記錄然后丟棄。

優化前:

-- 性能較差的分頁查詢
SELECT * FROM products ORDER BY id LIMIT 100000, 10;

優化方法1 - 使用索引覆蓋掃描:

-- 先獲取ID,再關聯查詢完整數據
SELECT p.* FROM products p
JOIN (SELECT id FROM products ORDER BY id LIMIT 100000, 10
) tmp ON p.id = tmp.id;

優化方法2 - 使用上次查詢的最大ID(不適合前端跳頁):

-- 假設已知上一頁的最大ID是100233
SELECT * FROM products WHERE id > 100233 ORDER BY id LIMIT 10;

5.避免使用SELECT *,只查詢需要的列

使用SELECT *會返回所有列,可能破壞覆蓋索引的效果,并增加網絡和內存開銷。

優化前:

-- 可能導致不必要的開銷
SELECT * FROM users WHERE name = 'Tom';

優化后:

-- 只返回需要的列,可能利用覆蓋索引
SELECT id, name, email FROM users WHERE name = 'Tom';

6.使用EXPLAIN分析查詢執行計劃

在優化前,先使用EXPLAIN分析SQL語句的執行計劃,了解索引使用情況。

EXPLAIN SELECT * FROM users WHERE name = 'Tom' AND age > 20;

重點關注以下字段:

??type: 從好到差依次是:system > const > eq_ref > ref > range > index > ALL(性能排序

??key: 實際使用的索引

??rows: 預計需要掃描的行數

??Extra: 額外信息,如"Using index"表示使用了覆蓋索引

五、特殊場景索引優化

1.使用索引排序優化ORDER BY操作

如果ORDER BY的列與WHERE使用的列不一致,排序無法使用索引,會導致文件排序(如果滿足`name='Tom'`的行數很多,那么排序可能會很慢,因為排序操作可能需要在內存或者磁盤上完成(即所謂的文件排序,filesort)。

優化前:

-- WHERE和ORDER BY使用不同的列,可能導致文件排序
CREATE INDEX idx_user_name ON users(name);
SELECT * FROM users WHERE name = 'Tom' ORDER BY age;

優化后:

-- 創建聯合索引同時包含WHERE和ORDER BY的列
CREATE INDEX idx_user_name_age ON users(name, age);
SELECT * FROM users WHERE name = 'Tom' ORDER BY age;

注意事項:?ORDER BY的多個字段需要與索引順序一致,且排序方向需一致(全ASC或全DESC)。

2.在大表上創建索引的最佳實踐

在大表上直接創建索引可能會導致長時間鎖表。可以使用以下方法優化:

方法1 - 使用低峰期操作:

-- 在低峰期執行索引創建
CREATE INDEX idx_order_status ON orders(status);

方法2 - 使用在線DDL(MySQL 8.0+首選方案):

-- 使用ALGORITHM和LOCK選項
CREATE INDEX idx_order_status ON orders(status)
ALGORITHM=INPLACE, LOCK=NONE;

技術原理:非阻塞索引構建

  1. ALGORITHM=INPLACE

    增量構建:僅掃描原表一次,中間數據存于臨時文件(非新建整表)?
    空間復用:無需額外占用等表大小的磁盤空間(對比ALGORITHM=COPY
  2. LOCK=NONE

    零鎖表:允許并發的SELECTDMLINSERT/UPDATE/DELETE
    底層通過行版本控制(如InnoDB的MVCC)實現讀寫分離

方法3 - 使用pt-online-schema-change工具:

pt-online-schema-change --alter "ADD INDEX idx_order_status (status)" \
--host=localhost --user=root --ask-pass --database=mydb --table=orders \
--execute

3.使用虛擬列為計算結果創建索引

對于經常需要計算后過濾的場景,可以使用虛擬列并在其上創建索引(關鍵字VIRTUAL)。

-- 添加虛擬列存儲計算結果
ALTER TABLE products?
ADD total_value DECIMAL(10,2) AS (price * quantity) VIRTUAL;-- 在虛擬列上創建索引
CREATE INDEX idx_total_value ON products(total_value);-- 使用計算列進行查詢
SELECT * FROM products WHERE total_value > 10000;

或者使用MySQL 8.0+的函數索引:

-- 添加虛擬列存儲計算結果
CREATE INDEX tatal_value ON products((price * quantity))-- 使用計算列進行查詢
SELECT * FROM products WHERE (price * quantity) > 10000;

虛擬列索引和函數索引是同一索引優化機制(預計算表達式+建索引)的兩種語法糖

  • 虛擬列索引:?通過創建"計算列"提供?顯式接口

  • 函數索引:?允許直接索引表達式?無需顯式列?

選擇誰 ≈ 選擇語法風格,而非性能差異,因為兩者在相同條件下性能命中索引時查詢性能一致。

六、索引維護優化

1.定期優化和重建索引

隨著數據變化,索引可能變得碎片化,影響性能。定期優化表和重建索引可以改善性能。

-- 分析表
ANALYZE TABLE orders;-- 優化表
OPTIMIZE TABLE orders;-- 或者重建索引
ALTER TABLE orders DROP INDEX idx_status, ADD INDEX idx_status(status);

總結:

  1. 日常用?ANALYZE?維持優化器準確性

  2. 定期監控碎片率,>30% 時用?OPTIMIZE

  3. 關鍵索引性能下降時單獨重建索引

  4. 永遠在業務低峰期操作!

注:下面提供一個碎片率的計算方式(參考):

-- 檢查碎片率
SELECT TABLE_NAME,ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS "Size(MB)",ROUND(DATA_FREE / 1024 / 1024, 2) AS "Free(MB)",ROUND((DATA_FREE / (DATA_LENGTH + INDEX_LENGTH)) * 100, 2) AS "Frag %"
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydb';

2.控制單表上的索引數量

索引數量過多會影響寫性能,建議每個表的索引數量控制在5個以內。

優化方法:

1. 刪除重復和未使用的索引

2. 合并功能類似的索引

2. 合并功能類似的索引-- 查找未使用的索引
SELECT * FROM schema_unused_indexes; ?-- Performance Schema-- 查找重復的索引
SELECT * FROM sys.schema_redundant_indexes; ?-- Sys Schema

3.使用降序索引優化排序

MySQL 8.0+支持降序索引,可以優化混合排序方向的查詢。

-- 創建混合排序方向的索引(MySQL 8.0+)
CREATE INDEX idx_user_age_score ON users(age ASC, score DESC);-- 可以高效執行的查詢
SELECT * FROM users ORDER BY age ASC, score DESC;

4.使用部分索引優化高選擇性數據

MySQL 8.0+支持在WHERE條件滿足時才為行創建索引記錄,減少索引大小。

-- 只為活躍用戶創建索引(MySQL 8.0+)
CREATE INDEX idx_active_users ON users(name, email)?
WHERE status = 'active';

七、索引監控與進階技巧

1.利用索引統計信息進行調優

MySQL維護了索引統計信息,可以幫助優化器選擇合適的索引。有時統計信息不準確會導致次優的執行計劃。

-- 查看表的統計信息
SHOW TABLE STATUS LIKE 'users';-- 查看索引的基數
SHOW INDEX FROM users;-- 刷新統計信息
ANALYZE TABLE users;

2.使用索引提示(Index Hints)解決優化器選擇問題

有時MySQL優化器的選擇不是最優的,可以使用索引提示強制使用特定索引。

-- 強制使用特定索引
SELECT * FROM users FORCE INDEX(idx_name_age)?
WHERE name = 'Tom' AND age > 20;-- 忽略特定索引
SELECT * FROM users IGNORE INDEX(idx_status)?
WHERE status = 'active' AND age > 20;

建議:?索引提示應該是最后的手段,通常先嘗試優化表結構和索引設計。

八、結語

索引優化是一個持續的過程,需要結合業務特點、數據分布和查詢模式來綜合考慮。

優秀的索引設計需要理論知識和實踐經驗的結合。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910512.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開關電源計算輔助軟件SMPSKIT V10.3

資料下載地址&#xff1a;開關電源計算輔助軟件SMPSKIT V10.3 SMPSKIT &#xff1a; 內置一些常見IC的計算 內置絕大多數磁芯數據 內置變壓器分層計算器 可用戶編程功能 包含絕大多數拓…

OpenHarmony應用開發-全量包的使用

文章目錄 一、下載full-sdk二、替換本地對應版本的SDK1.查看本地SDK安裝目錄2.替換對應的SDK版本 三、升級APL權限為系統權限&#xff08;升級后便可使用系統接口&#xff09;四、重啟IDE并重新進行應用簽名總結 一、下載full-sdk 可以在官方提供的“每日構建”中搜索對應版本…

sudo安裝pip包的影響

使用 sudo 安裝的 pip 包和不使用 sudo 安裝的 pip 包在 Ubuntu 20.04 上有以下幾個主要區別&#xff1a; 1. 安裝位置&#xff1a; 使用 sudo: 包會被安裝到系統級別的 Python 環境中&#xff0c;通常是 /usr/local/lib/python3.8/dist-packages/ 或 /usr/lib/python3/dist-…

uniapp 多圖上傳,加水印功能(全平臺通用)

多圖上傳和水印都是比較難得&#xff0c;特別是有的api只支持在小程序用&#xff0c;h5不給用 效果圖 普通的多圖上傳 // 多圖上傳 // count&#xff1a;最大數量 export function headerUploads0(count 9, orderNumber , watermarkInfo) {return new Promise((resolve, r…

【appium】5. Appium WebDriver 支持的常用方法匯總

下面是一個完整的 Appium WebDriver 支持的常用方法匯總&#xff0c;并附上典型用法示例。 一、元素查找方法/元素操作方法 ? 使用 find_element() 和 find_elements() from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy# 單個元素查找 …

FreeRTOS 介紹、使用方法及應用場景

一、FreeRTOS 概述 FreeRTOS 是一款廣泛應用于嵌入式系統的實時操作系統&#xff08;RTOS&#xff09;&#xff0c;具有開源、可移植、可裁剪、輕量級等顯著特點。它最初由 Richard Barry 開發&#xff0c;如今已成為全球開發者在物聯網、工業控制、消費電子等領域的熱門選擇&a…

深度解析 Caffeine:高性能 Java 緩存庫

1. Caffeine 簡介 Caffeine 是一個基于 Java 8 的高性能本地緩存庫&#xff0c;由 Ben Manes 開發&#xff0c;旨在替代 Google Guava Cache&#xff0c;提供更優的緩存策略、更高的吞吐量和更靈活的配置。 核心優勢 ? 卓越的性能&#xff1a;采用優化的數據結構&#xff0…

創客匠人賦能創始人 IP 打造:健康行業知識變現案例深度解析

在知識服務行業蓬勃發展的當下&#xff0c;創始人 IP 打造已成為知識變現的核心驅動力。創客匠人近期披露的陪跑案例顯示&#xff0c;通過系統化的線上線下聯動運營&#xff0c;傳統行業從業者可高效實現 IP 價值轉化。以亓黃中醫科技創始人吳豐言老師為例&#xff0c;其在創客…

64、最小路徑和

題目&#xff1a; 解答&#xff1a; 簡單dp。 定義&#xff1a;dp[i][j]為到達(i,j)所需要的最短路程 初始化&#xff1a;dp[0][0]grid[0][0]&#xff0c;同時對第一行和第一列的&#xff0c;第i個就是前i個之和加上自身 遞歸&#xff1a;dp[i][j]min(dp[i-1][j],dp[i][j-1…

獲取連接通義千問大語言模型配置信息的步驟:api_key、api_url

一、注冊并開通通義千問API服務 1. 注冊阿里云賬號 訪問 阿里云官網點擊右上角"免費注冊"&#xff0c;按指引完成賬號注冊和實名認證 2. 開通通義千問API服務 進入 通義千問API產品頁點擊"立即開通"&#xff0c;按提示完成服務開通&#xff08;部分服務…

汽車加氣站操作工考試題庫含答案【最新】

1.天然氣的主要成分是&#xff08;&#xff09;。 A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案&#xff1a;C 2.CNG 加氣站中&#xff0c;加氣機的加氣軟管應&#xff08;&#xff09;進行檢查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 3.儲氣罐的安全閥應&#xf…

顯示任何結構的數組對象數據【向上自動滾動】

顯示任何結構的數組對象數據 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>地圖編輯軟件 - 數…

GPIO模式詳解

一、GPIO的八種模式 GPIO支持4種輸入模式&#xff08;浮空輸入、上拉輸入、下拉輸入、模擬輸入&#xff09;和4種輸出模式&#xff08;開漏輸出、開漏復用輸出、推挽輸出、推挽復用輸出&#xff09;。 GPIO_Mode_AIN模擬輸入GPIO_Mode_IN_FLOATING浮空輸入GPIO_Mode_IPD下拉輸…

django rest_framework 自定義403 Forbidden錯誤頁面

django本來有是可以很方便自定義HTTP錯誤頁面的&#xff0c;網上資料一大把。核心是在項目的urls代碼中增加handler403的定義&#xff0c;比如&#xff1a; handler403 "app.views.your_custom_view" 404&#xff0c;500都是一樣的&#xff0c;重新定義handler404…

Kafka Streams架構深度解析:從并行處理到容錯機制的全鏈路實踐

在流處理技術領域&#xff0c;Kafka Streams以其輕量級架構與Kafka生態的深度整合能力脫穎而出。作為構建在Kafka生產者/消費者庫之上的流處理框架&#xff0c;它通過利用Kafka原生的分區、副本與協調機制&#xff0c;實現了數據并行處理、分布式協調與容錯能力的無縫集成。本文…

【嵌入式硬件實例】-555定時器控制舵機/伺服電機

555定時器控制舵機/伺服電機 文章目錄 555定時器控制舵機/伺服電機1、555定時器介紹2、舵機/伺服電機介紹3、硬件準備與接線使用 555 定時器 IC 的伺服電機控制器和測試儀電路是一個簡單的電路,可用于生成操作伺服電機所需的控制信號。該電路允許我們通過按下按鈕手動驅動/控制…

國產麒麟 安裝可視化數據庫軟件DBeaver(圖解)

目錄 ????????編輯DBeaver介紹 官網 通過強制使用 Ubuntu 模板來修復 add-apt-repository 重新添加 PPA 撤銷更改&#xff08;可選&#xff09; 官網直接下載 DBeaver CE 下載好后安裝軟件 啟動方式一 啟動方式二 啟動成功 在左側右擊新建連接 安裝驅動 測…

線程池 JMM 內存模型

線程池 & JMM 內存模型 文章目錄 線程池 & JMM 內存模型線程池線程池的創建ThreadPoolExecutor 七大參數飽和策略ExecutorService 提交線程任務對象執行的方法&#xff1a;ExecutorService 關閉線程池的方法&#xff1a;線程池最大線程數如何確定&#xff1f; volatile…

[論文閱讀] 軟件工程 + 教學 | 軟件工程項目管理課程改革:從傳統教學到以學生為中心的混合式學習實踐

軟件工程項目管理課程改革&#xff1a;從傳統教學到以學生為中心的混合式學習實踐 論文信息 arXiv:2506.14369 Agile and Student-Centred Teaching of Agile/Scrum Concepts Maria Spichkova Comments: Preprint. Accepted to the 29th International Conference on Knowledg…

Windows系統提示“mfc140u.dll丟失”?詳細修復指南,一鍵恢復程序運行!

當你興致勃勃地打開某個游戲或專業軟件時&#xff0c;突然彈出一條錯誤提示——“MFC140u.dll丟失”&#xff0c;程序直接閃退&#xff0c;讓人無比沮喪。別擔心&#xff01;這個問題并不復雜&#xff0c;通常只需重新安裝運行庫或修復系統文件即可解決。本文將為你提供詳細的修…