InnoDB 表主鍵建議遵循:
BIGINT UNSIGNED 或 INT UNSIGNED優勢:順序寫入降低頁分裂概率,固定主鍵減少物理位置變動,配合 innodb_fill_factor 進一步優化頁填充率。
| 引擎 | 主鍵查詢 | 唯一索引(非空) | 普通索引 |
|---|---|---|---|
| MyISAM | 基準 1.0x | ≈ 1.0x(本質相同) | 慢 30%+ |
| InnoDB | 基準 1.0x | 慢 ~9%(需回表) | 慢 50%+(雙重查找) |
InnoDB 唯一索引查詢需「輔助索引 → 主鍵索引」兩次 B+ 樹查找;普通索引甚至需多次檢索確認是否還有滿足條件的行。
聚簇索引:索引鍵值邏輯順序決定數據行物理存儲順序。InnoDB 表即索引組織表(IOT),主鍵即聚簇索引,葉子節點包含完整行數據(+ 隱藏列:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR)。
非聚簇索引:僅建立索引結構,不影響物理存儲順序。MyISAM 為堆組織表(HOT),數據按插入時間順序存放,索引葉子節點存數據指針。
無主鍵且無非空唯一鍵時,InnoDB 隱式創建 ROWID 聚簇索引,但無法被用戶引用,且佔用額外存儲空間。
| 維度 | 聚簇索引表 | 堆組織表 |
|---|---|---|
| 範圍查詢 | 極快(順序讀取) | 需大量隨機 I/O |
| 主鍵點查 | 單次 B+ 樹查找 | 索引查找 + 回表 |
| 熱點數據更新 | 原地更新,碎片少 | 易產生行遷移鏈 |
| 離散寫入 | 頁分裂頻繁,性能抖動 | 順序追加,寫入穩定 |
| 二級索引體積 | 含主鍵值,相對較大 | 僅含指針,相對較小 |
Innodb_buffer_pool_pages_dirty 與 Innodb_page_splits 指標,評估主鍵設計合理性