MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段
非聚簇索引:索引與真實數(shù)據(jù)文件不在一個文件中
myisam的一個數(shù)據(jù)表table中,它是有table.frm、table.myd以及table.myi組成。
table.myd記錄了數(shù)據(jù),table.myi記錄了索引的數(shù)據(jù)。
在用到索引時,先到table.myi(索引樹)中進行查找,取到數(shù)據(jù)所在table.myd的行位置,拿到數(shù)據(jù)。
所以myisam引擎的索引文件和數(shù)據(jù)文件是獨立分開的,則稱之為非聚簇索引。myisam類型的索引,指向數(shù)據(jù)在行的位置
聚簇索引:索引與數(shù)據(jù)是在一個文件中的
聚簇”的意思是數(shù)據(jù)行被按照一定順序一個個緊密地排列在一起存儲
InnoDB的數(shù)據(jù)文件只有數(shù)據(jù)結構文件.frm和數(shù)據(jù)文件.idb 其中.idb中存放的是數(shù)據(jù)和索引信息是存放在一起的
在innodb中,即存儲主鍵索引值,又存儲行數(shù)據(jù),稱之為聚簇索引。
innodb中,沒有主鍵索引;
則會使用unique索引,沒有unique索引;
當這種列不存在的時候,會默認生成一個6字節(jié)整型的隱藏列作為主鍵;
一本英文課本為例,要找第8課,直接翻書,若先翻到第5課,則往后翻,再翻到第10課,則又往前翻。這本書本身就是一個索引,即“聚簇索引”。
如果要找"fire”這個單詞,會翻到書后面的附錄,這個附錄是按字母排序的,找到F字母那一塊,再找到"fire”,對應的會是它在第幾課。這個附錄,為“非聚簇索引”。
由此可見,聚簇索引,索引的順序就是數(shù)據(jù)存放的順序,所以,很容易理解,一張數(shù)據(jù)表只能有一個聚簇索引。
優(yōu)缺點
聚簇索引將索引和數(shù)據(jù)行保存在同一個B-Tree中,查詢通過聚簇索引可以直接獲取數(shù)據(jù),相比非聚簇索引需要第二次查詢(非覆蓋索引的情況下)效率要高。
聚簇索引對于范圍查詢的效率很高,因為其數(shù)據(jù)是按照大小排列的,
缺點
聚簇索引的更新代價比較高,如果更新了行的聚簇索引列,就需要將數(shù)據(jù)移動到相應的位置。這可能因為要插入的頁已滿而導致“頁分裂”。
插入速度嚴重依賴于插入順序,按照主鍵進行插入的速度是加載數(shù)據(jù)到Innodb中的最快方式。如果不是按照主鍵插入,最好在加載完成后使用OPTIMIZE TABLE命令重新組織一下表。
聚簇索引在插入新行和更新主鍵時,可能導致“頁分裂”問題。
聚簇索引可能導致全表掃描速度變慢,因為可能需要加載物理上相隔較遠的頁到內存中(需要耗時的磁盤尋道操作)。
圖示
總結
以上是生活随笔為你收集整理的MySQL聚簇索引:叶子保存主键或unique字段+data 非聚簇保存索引字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一元硬币正面是哪一面
- 下一篇: 招联金融额度人工可以解封吗 答案肯定是不