詳解MySQL 聚簇索引與非聚簇索引
1、聚集索引
表數(shù)據(jù)按照索引的順序來存儲的,也就是說索引項的順序與表中記錄的物理順序一致。對于聚集索引,葉子結點即存儲了真實的數(shù)據(jù)行,不再有另外單獨的數(shù)據(jù)頁。
在一張表上最多只能創(chuàng)建一個聚集索引,因為真實數(shù)據(jù)的物理順序只能有一種。
從物理文件也可以看出 InnoDB(聚集索引)的數(shù)據(jù)文件只有數(shù)據(jù)結構文件.frm和數(shù)據(jù)文件.idb 其中.idb中存放的是數(shù)據(jù)和索引信息 是存放在一起的。
2、非聚集索引
表數(shù)據(jù)存儲順序與索引順序無關。對于非聚集索引,葉結點包含索引字段值及指向數(shù)據(jù)頁數(shù)據(jù)行的邏輯指針,其行數(shù)量與數(shù)據(jù)表行數(shù)據(jù)量一致。
從物理文件中也可以看出 MyISAM(非聚集索引)的索引文件.MYI和數(shù)據(jù)文件.MYD是分開存儲的 是相對獨立的
總結:
聚簇索引和非聚簇索引的區(qū)別是:
聚簇索引(innoDB)的葉子節(jié)點就是數(shù)據(jù)節(jié)點;
而非聚簇索引(myisam)的葉子節(jié)點仍然是索引文件 只是這個索引文件中包含指向對應數(shù)據(jù)塊的指針
對于 非聚簇索引 來說,每次通過索引檢索到所需行號后,還需要通過葉子上的磁盤地址去磁盤內取數(shù)據(jù)(回行)消耗時間。為了優(yōu)化這部分回行取數(shù)據(jù)時間,InnoDB 引擎采用了聚簇索引。
聚簇索引,即將數(shù)據(jù)存入索引葉子頁面上。對于 InnoDB 引擎來說,葉子頁面不再存該行對應的地址,而是直接存儲數(shù)據(jù)。
這樣便避免了回行操作所帶來的時間消耗。 使得 InnoDB 在某些查詢上比 MyISAM 還要快!
ps. 關于查詢時間,一般認為 MyISAM 犧牲了功能換取了性能,查詢更快。但事實并不一定如此。多數(shù)情況下,MyISAM 確實比 InnoDB 查的快 。但是查詢時間受多方面因素影響。InnoDB 查詢變慢得原因是因為支持事務、回滾等等,使得 InnoDB的葉子頁面實際上還包含有事務id(換句話說就是版本號) 以及回滾指針。
動作描述 | 使用聚集索引 | 使用非聚集索引 |
列經常被分組排序 | 使用 | 使用 |
返回某范圍內的數(shù)據(jù) | 使用 | 不使用 |
一個或極少不同值 | 不使用 | 不使用 |
小數(shù)目的不同值 | 使用 | 不使用 |
大數(shù)目的不同值 | 不使用 | 使用 |
頻繁更新的列 | 不使用 | 使用 |
外鍵列 | 使用 | 使用 |
主鍵列 | 使用 | 使用 |
頻繁修改索引列 | 不使用 | 使用 |
簡單來說,聚簇索引不適用于頻繁更新的列、頻繁修改的索引列和小數(shù)目的不同值。
以上就是詳解MySQL 聚簇索引與非聚簇索引的詳細內容,更多關于MySQL 聚簇索引與非聚簇索引的資料請關注腳本之家其它相關文章!
相關文章
MySQL中CONCAT()函數(shù)出現(xiàn)值為空的問題及解決辦法
項目中查詢用到了concat()拼接函數(shù),本文主要介紹了MySQL中CONCAT()函數(shù)出現(xiàn)值為空的問題及解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07asp+mysql+utf8 網頁出現(xiàn)亂碼問題的解決方法
無論在網頁中加多少UTF8的定義,顯示的結果都還是會有一些小格子,反而定義為gb2312,顯示完全正常2014-03-03基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù)
這篇文章主要介紹了基于mysql實現(xiàn)group by取各分組最新一條數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09mysql處理海量數(shù)據(jù)時的一些優(yōu)化查詢速度方法
最近一段時間由于工作需要,開始關注針對Mysql數(shù)據(jù)庫的select查詢語句的相關優(yōu)化方法,需要的朋友可以參考下2017-04-04mysql show processlist 顯示mysql查詢進程
processlist命令的輸出結果顯示了有哪些線程在運行,可以幫助識別出有問題的查詢語句,兩種方式使用這個命令2012-03-03MySQL操作數(shù)據(jù)庫和表的常用命令新手教程
這篇文章主要介紹了MySQL操作數(shù)據(jù)庫和表的常用命令新手教程,本文總結的命令都是控制mysql必須掌握的、常用的命令,需要的朋友可以參考下2014-09-09