MySQL聚簇索引:葉子保存主鍵或unique字段+data 非聚簇保存索引字段

非聚簇索引:索引與真實數據文件不在一個文件中

myisam的一個數據表table中,它是有table.frm、table.myd以及table.myi組成。

table.myd記錄了數據,table.myi記錄了索引的數據。

在用到索引時,先到table.myi(索引樹)中進行查找,取到數據所在table.myd的行位置,拿到數據。

所以myisam引擎的索引文件和數據文件是獨立分開的,則稱之爲非聚簇索引。myisam類型的索引,指向數據在行的位置

聚簇索引:索引與數據是在一個文件中的

聚簇”的意思是數據行被按照一定順序一個個緊密地排列在一起存儲

InnoDB的數據文件只有數據結構文件.frm和數據文件.idb 其中.idb中存放的是數據和索引信息是存放在一起的

在innodb中,即存儲主鍵索引值,又存儲行數據,稱之爲聚簇索引。

innodb中,沒有主鍵索引;

則會使用unique索引,沒有unique索引;

當這種列不存在的時候,會默認生成一個6字節整型的隱藏列作爲主鍵;

一本英文課本爲例,要找第8課,直接翻書,若先翻到第5課,則往後翻,再翻到第10課,則又往前翻。這本書本身就是一個索引,即“聚簇索引”。
如果要找"fire”這個單詞,會翻到書後面的附錄,這個附錄是按字母排序的,找到F字母那一塊,再找到"fire”,對應的會是它在第幾課。這個附錄,爲“非聚簇索引”。
由此可見,聚簇索引,索引的順序就是數據存放的順序,所以,很容易理解,一張數據表只能有一個聚簇索引。

優缺點

聚簇索引將索引和數據行保存在同一個B-Tree中,查詢通過聚簇索引可以直接獲取數據,相比非聚簇索引需要第二次查詢(非覆蓋索引的情況下)效率要高。

聚簇索引對於範圍查詢的效率很高,因爲其數據是按照大小排列的,

缺點

聚簇索引的更新代價比較高,如果更新了行的聚簇索引列,就需要將數據移動到相應的位置。這可能因爲要插入的頁已滿而導致“頁分裂”。

插入速度嚴重依賴於插入順序,按照主鍵進行插入的速度是加載數據到Innodb中的最快方式。如果不是按照主鍵插入,最好在加載完成後使用OPTIMIZE TABLE命令重新組織一下表。

聚簇索引在插入新行和更新主鍵時,可能導致“頁分裂”問題。

聚簇索引可能導致全表掃描速度變慢,因爲可能需要加載物理上相隔較遠的頁到內存中(需要耗時的磁盤尋道操作)。

圖示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章