假設 100 萬行、4KB 頁存 100 行 → 1 萬頁。無索引全掃最壞 1 萬次隨機 I/O × 10ms = 100 秒。B+ 樹索引 log100(106) = 3 次頁讀取 → 30ms。索引是性能調優的起點。
標識列首選 INT UNSIGNED AUTO_INCREMENT;IP 存 INT UNSIGNED (INET_ATON/INET_NTOA);時間用原生 DATETIME/TIMESTAMP。
| 類型 | 結構 | 特點 | 適用 |
|---|---|---|---|
| B+ Tree | 平衡樹,葉子鏈表 | 支援全鍵/範圍/前綴查詢,最左前綴原則 | 通用首選 |
| Hash | 哈希表 (Memory/NDB) | 僅支援精確匹配,無序、無範圍 | 查找表、緩存 |
| Fulltext | 倒排索引 | 自然語言/布爾模式全文搜尋 | 文檔搜尋 |
| Spatial (R-Tree) | R 樹 | 空間幾何查詢 (MBR 相交/包含) | GIS |
最佳實踐:InnoDB 使用 自增整數主鍵,保證順序寫入、避免頁分裂、縮小二級索引體積。
查詢列全部包含在索引中 → Extra: Using index。InnoDB 二級索引葉子含主鍵,故含主鍵查詢易覆蓋。
-- 索引 idx_store_id_film_id (store_id, film_id)
SELECT store_id, film_id FROM inventory; -- 覆蓋
SELECT * FROM inventory WHERE store_id=1; -- 非覆蓋,需回表
EXPLAIN 關鍵:type=index + Extra 無 Using filesortBEGIN;
SELECT * FROM actor WHERE actor_id < 4 AND actor_id <> 1 FOR UPDATE;
-- 實際鎖住 1,2,3 三行!因優化器僅用索引範圍掃描,無法下推 <> 過濾
對應 EXPLAIN 顯示 Using where; Using index。InnoDB 鎖住索引掃描到的所有行,非索引條件不縮小鎖範圍。
pt-query-digest 定位 Top SQLEXPLAIN 分析訪問類型、可能索引、實際索引、rows、Extra原文:理解MySQL——索引與優化