PRIMARY KEY 約束NULLBIGINT UNSIGNED AUTO_INCREMENTTIMESTAMP、UUID() 等收益:順序寫入減少頁分裂、主鍵不變避免行遷移與碎片。
SECONDARY KEYUNIQUE KEY)與 普通索引(INDEX/KEY)NULL(多列唯一索引允許部分 NULL)| 引擎 | 主鍵索引 | 不允許 NULL 的唯一索引 | 普通索引 |
|---|---|---|---|
| MyISAM | 本質相同(除 NULL 語義) | 本質相同 | 葉子節點存行指標 |
| InnoDB | 聚集索引(葉子=完整行) | 二級索引(葉子=索引列+PK) | 二級索引(葉子=索引列+PK) |
| 引擎 | 主鍵索引 | 唯一索引 | 普通索引 |
|---|---|---|---|
| MyISAM | 基準 (1.0x) | ≈ 1.0x | 慢 30%+ |
| InnoDB | 基準 (1.0x) | 慢 ~9% | 慢 50%+ |
原因分析:
UNIQUE KEY,物理主鍵用自增 ID| 誤區 | 真相 |
|---|---|
| 主鍵一定是聚集索引 | InnoDB 是,MyISAM 不是(無聚集索引) |
| 聚集索引一定是主鍵 | 無主鍵時,第一個 NOT NULL UNIQUE 索引成為聚集索引 |
| 唯一索引比普通索引快很多 | InnoDB 中兩者結構相同,差在唯一性檢查邏輯 |
| 查詢走索引就很快 | 需看是否回表、掃描行數、是否 Using index condition |
InnoDB 中主鍵索引即聚集索引,擁有天然效能優勢。輔助索引(唯一/普通)葉子節點存主鍵值,查詢需回表。設計表時:**物理主鍵用自增無業務含義列,業務唯一性用 UNIQUE KEY 保證,高頻查詢用覆蓋索引優化**,是索引設計的鐵律。