MySQL 中的聚簇索引和非聚簇索引有什么區別?
1. 從不同存儲引擎去考慮
- 在MySIAM存儲引擎中,索引和數據是分開存儲的,包括主鍵索引在內的所有索引都是“非聚簇”的,每個索引的葉子節點存儲的是數據記錄的物理地址(指針),而不是數據本身
- 而在InnoDB存儲引擎中,InnoDB 的主鍵索引是聚簇索引,葉子節點直接包含完整數據記錄
2. 從InnoDB內部去考慮
- 聚簇索引
- 索引葉子結點存儲的是數據行,可以直接訪問完整數據
- 每個表只能有一個聚簇索引,通常是主鍵索引,適合范圍查詢和排序
- 非聚簇索引
- 索引的葉子結點存儲的是主鍵和對應的索引列,而不是完整數據,如需訪問完整數據需要根據主鍵回表查詢
- 一個表可以有多個非聚簇索引,適用于快速查找對應的列數據
注意,主鍵索引和聚簇索引的區別,他們并不相等!
- 主鍵優先:
-
- 如果表定義了PRIMARY KEY,則自動使用主鍵作為聚簇索引
- 無主鍵時的選擇:
-
- 如果沒有主鍵,InnoDB會選擇第一個所有列都是NOT NULL的UNIQUE索引作為聚簇索引
- 如果既沒有主鍵也沒有符合條件的UNIQUE索引,InnoDB會內部生成一個隱藏的6字節列(
DB_ROW_ID
)作為聚簇索引