索引是 MySQL 效能的靈魂。在 InnoDB 與 MyISAM 兩大引擎中,主鍵索引與輔助索引的存儲結構、查詢路徑、效能特徵存在本質差異。本文系統梳理兩者定義、InnoDB/MyISAM 下的異同、實測效能數據,並給出主鍵設計黃金法則。
PRIMARY KEY,由一或多欄位組成,唯一標識每行資料。一張表最多一個主鍵,值不可為 NULL。SECONDARY KEY),包含 唯一索引(UNIQUE KEY,允許單個 NULL)與 普通索引(INDEX,允許重複與 NULL)。.MYD / .MYI)。ROW_ID、rollback pointer、trx_id 等隱藏列)。PRIMARY KEY;NOT NULL UNIQUE 索引;ROW_ID(單調遞增)。DELETE + INSERT,導致頁分裂、碎片、鎖競爭。TIMESTAMP、UUID、MD5):隨機分布導致大量隨機 I/O、頁分裂、碎片爆增。WHERE id BETWEEN ...)可順序讀取,極大發揮預讀優勢;| 引擎 | 主鍵索引 | 唯一索引 | 普通索引 |
|---|---|---|---|
| MyISAM | 基準 (1.0x) | ≈ 1.0x | 慢 30%+ |
| InnoDB | 基準 (1.0x) | 慢 ~9% | 慢 50%+ |
結論: InnoDB 下主鍵查詢最快;唯一索引需一次回表(輔助索引→主鍵索引);普通索引可能需多次回表(掃描滿足條件的所有主鍵值)。
| 類型 | 約束 | 適用場景 |
|---|---|---|
唯一索引 (UNIQUE) | 值唯一,允許單個 NULL | 業務鍵(身分證、手機、郵箱)、防重複提交 |
普通索引 (INDEX) | 允許重複與 NULL | 高頻查詢欄位、連接條件、排序/分組欄位 |
| 聯合索引 | 多欄位組合,遵循最左前綴原則 | 多條件查詢(WHERE a=1 AND b=2)、覆蓋索引 |
全文索引 (FULLTEXT) | 文本搜尋 | 文章、日志、評論內容搜尋(MySQL 5.6+ InnoDB 支援) |
ANALYZE TABLE 更新統計資訊:防止優化器誤判導致全表掃描。Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests:命中率低於 99% 需擴容 Buffer Pool 或優化索引。InnoDB 中主鍵索引即聚集索引,資料與索引合一;輔助索引通過主鍵值回表。主鍵設計應遵循「自增、不變、無業務含義」三原則。理解兩者存儲結構與查詢路徑差異,是編寫高效 SQL、設計高效能資料庫架構的基石。