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