詳解MySQL 聚簇索引與非聚簇索引
1、聚集索引
表數(shù)據(jù)按照索引的順序來存儲的,也就是說索引項的順序與表中記錄的物理順序一致。對于聚集索引,葉子結(jié)點即存儲了真實的數(shù)據(jù)行,不再有另外單獨的數(shù)據(jù)頁。
在一張表上最多只能創(chuàng)建一個聚集索引,因為真實數(shù)據(jù)的物理順序只能有一種。
從物理文件也可以看出 InnoDB(聚集索引)的數(shù)據(jù)文件只有數(shù)據(jù)結(jié)構(gòu)文件.frm和數(shù)據(jù)文件.idb 其中.idb中存放的是數(shù)據(jù)和索引信息 是存放在一起的。
2、非聚集索引
表數(shù)據(jù)存儲順序與索引順序無關(guān)。對于非聚集索引,葉結(jié)點包含索引字段值及指向數(shù)據(jù)頁數(shù)據(jù)行的邏輯指針,其行數(shù)量與數(shù)據(jù)表行數(shù)據(jù)量一致。
從物理文件中也可以看出 MyISAM(非聚集索引)的索引文件.MYI和數(shù)據(jù)文件.MYD是分開存儲的 是相對獨立的
總結(jié):
聚簇索引和非聚簇索引的區(qū)別是:
聚簇索引(innoDB)的葉子節(jié)點就是數(shù)據(jù)節(jié)點;
而非聚簇索引(myisam)的葉子節(jié)點仍然是索引文件 只是這個索引文件中包含指向?qū)?yīng)數(shù)據(jù)塊的指針
對于 非聚簇索引 來說,每次通過索引檢索到所需行號后,還需要通過葉子上的磁盤地址去磁盤內(nèi)取數(shù)據(jù)(回行)消耗時間。為了優(yōu)化這部分回行取數(shù)據(jù)時間,InnoDB 引擎采用了聚簇索引。聚簇索引,即將數(shù)據(jù)存入索引葉子頁面上。對于 InnoDB 引擎來說,葉子頁面不再存該行對應(yīng)的地址,而是直接存儲數(shù)據(jù)。
這樣便避免了回行操作所帶來的時間消耗。 使得 InnoDB 在某些查詢上比 MyISAM 還要快!
ps. 關(guān)于查詢時間,一般認(rèn)為 MyISAM 犧牲了功能換取了性能,查詢更快。但事實并不一定如此。多數(shù)情況下,MyISAM 確實比 InnoDB 查的快 。但是查詢時間受多方面因素影響。InnoDB 查詢變慢得原因是因為支持事務(wù)、回滾等等,使得 InnoDB的葉子頁面實際上還包含有事務(wù)id(換句話說就是版本號) 以及回滾指針。
動作描述 使用聚集索引 使用非聚集索引 列經(jīng)常被分組排序 使用 使用 返回某范圍內(nèi)的數(shù)據(jù) 使用 不使用 一個或極少不同值 不使用 不使用 小數(shù)目的不同值 使用 不使用 大數(shù)目的不同值 不使用 使用 頻繁更新的列 不使用 使用 外鍵列 使用 使用 主鍵列 使用 使用 頻繁修改索引列 不使用 使用
簡單來說,聚簇索引不適用于頻繁更新的列、頻繁修改的索引列和小數(shù)目的不同值。
以上就是詳解MySQL 聚簇索引與非聚簇索引的詳細(xì)內(nèi)容,更多關(guān)于MySQL 聚簇索引與非聚簇索引的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Microsoft Office Access隱藏和顯示字段的方法2. SQL Server自動生成日期加數(shù)字的序列號3. 關(guān)于Sql server數(shù)據(jù)庫日志滿的快速解決辦法4. SQL Server數(shù)據(jù)庫連接查詢和子查詢實戰(zhàn)案例5. Access創(chuàng)建一個簡單MIS管理系統(tǒng)6. 關(guān)于SQL server中字段值為null的查詢7. Microsoft Office Access凍結(jié)字段的方法8. How to access eclipse workspace?9. DB2 9(Viper)快速入門10. SQL語句中的ON DUPLICATE KEY UPDATE使用
