MySQL 主鍵索引和聚簇索引的區別
mysql 主鍵索引和聚簇索引的區別
1. 主鍵索引和聚簇索引的區別
mysql 聚簇索引的葉子節點就是數據節點,主鍵索引就是聚簇索引嗎?答案是否定的。
在 mysql 數據庫 innodb 引擎里面,主鍵索引確實就是聚簇索引。但是 myisam 引擎里面主鍵索引并不是聚簇索引。
2. 聚簇索引生成規則
對于 innodb,主鍵毫無疑問是一個聚簇索引。但是當一個表沒有主鍵,或者沒有一個索引,innodb 會如何處理呢?
- 1. 如果一個主鍵被定義了,那么這個主鍵就是作為聚簇索引。
- 2. 如果沒有主鍵被定義,那么該表的第一個唯一非空索引被作為聚簇索引。
- 3. 如果沒有主鍵也沒有合適的唯一索引,那么innodb內部會生成一個隱藏的主鍵作為聚簇索引,這個隱藏的主鍵是一個6個字節的列,改列的值會隨著數據的插入自增。
- 4.自增主鍵會把數據自動向后插入,避免了插入過程中的聚簇索引排序問題。
聚簇索引的排序,必然會帶來大范圍的數據的物理移動,這里面帶來的磁盤 io 性能損耗是非常大的。 而如果聚簇索引上的值可以改動的話,那么也會觸發物理磁盤上的移動,于是就可能出現 page 分裂,表碎片橫生。所以不應該修改聚簇索引。