您好,登錄后才能下訂單哦!
MySQL中聚簇索引與非聚簇索引的區別?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1、聚集索引
表數據按照索引的順序來存儲的,也就是說索引項的順序與表中記錄的物理順序一致。對于聚集索引,葉子結點即存儲了真實的數據行,不再有另外單獨的數據頁。
在一張表上最多只能創建一個聚集索引,因為真實數據的物理順序只能有一種。
從物理文件也可以看出 InnoDB(聚集索引)的數據文件只有數據結構文件.frm和數據文件.idb 其中.idb中存放的是數據和索引信息 是存放在一起的。
2、非聚集索引
表數據存儲順序與索引順序無關。對于非聚集索引,葉結點包含索引字段值及指向數據頁數據行的邏輯指針,其行數量與數據表行數據量一致。
從物理文件中也可以看出 MyISAM(非聚集索引)的索引文件.MYI和數據文件.MYD是分開存儲的 是相對獨立的
總結:
聚簇索引和非聚簇索引的區別是:
聚簇索引(innoDB)的葉子節點就是數據節點;
而非聚簇索引(myisam)的葉子節點仍然是索引文件 只是這個索引文件中包含指向對應數據塊的指針
對于 非聚簇索引 來說,每次通過索引檢索到所需行號后,還需要通過葉子上的磁盤地址去磁盤內取數據(回行)消耗時間。為了優化這部分回行取數據時間,InnoDB 引擎采用了聚簇索引。
聚簇索引,即將數據存入索引葉子頁面上。對于 InnoDB 引擎來說,葉子頁面不再存該行對應的地址,而是直接存儲數據。
這樣便避免了回行操作所帶來的時間消耗。 使得 InnoDB 在某些查詢上比 MyISAM 還要快!
ps. 關于查詢時間,一般認為 MyISAM 犧牲了功能換取了性能,查詢更快。但事實并不一定如此。多數情況下,MyISAM 確實比 InnoDB 查的快 。但是查詢時間受多方面因素影響。InnoDB 查詢變慢得原因是因為支持事務、回滾等等,使得 InnoDB的葉子頁面實際上還包含有事務id(換句話說就是版本號) 以及回滾指針。
動作描述 | 使用聚集索引 | 使用非聚集索引 |
列經常被分組排序 | 使用 | 使用 |
返回某范圍內的數據 | 使用 | 不使用 |
一個或極少不同值 | 不使用 | 不使用 |
小數目的不同值 | 使用 | 不使用 |
大數目的不同值 | 不使用 | 使用 |
頻繁更新的列 | 不使用 | 使用 |
外鍵列 | 使用 | 使用 |
主鍵列 | 使用 | 使用 |
頻繁修改索引列 | 不使用 | 使用 |
簡單來說,聚簇索引不適用于頻繁更新的列、頻繁修改的索引列和小數目的不同值。
關于MySQL中聚簇索引與非聚簇索引的區別問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。