Mysql中的聚簇索引cluster index解析
聚簇索引(cluster index)
一個(gè)表只能有一個(gè)聚簇索引。
目前,只有solidDB和InnoDB支持聚簇索引,MyISAM不支持聚簇索引。一些DBMS允許用戶指定聚簇索引,但是MySQL的存儲(chǔ)引擎到目前為止都不支持。
InnoDB的聚簇索引:
- InnoDB對(duì)主鍵建立聚簇索引。
- 如果你不指定主鍵,InnoDB會(huì)用一個(gè)具有唯一且非空值的索引來(lái)代替。
- 如果不存在這樣的索引,InnoDB會(huì)定義一個(gè)隱藏的主鍵,然后對(duì)其建立聚簇索引
InnoDB默認(rèn)使用聚簇索引來(lái)組織數(shù)據(jù),如果你用InnoDB,而且不需要特殊的聚簇索引,一個(gè)好的做法就是使用代理主鍵(surrogate key)—獨(dú)立于你的應(yīng)用中的數(shù)據(jù)。最簡(jiǎn)單的做法就是使用一個(gè)AUTO_INCREMENT的列,這會(huì)保證記錄按照順序插入,而且能提高使用primary_key進(jìn)行連接的查詢的性能。應(yīng)該盡量避免隨機(jī)的聚簇主鍵,例如字符串主鍵就是一個(gè)不好的選擇,它使得插入操作變得隨機(jī)
變得隨機(jī)的不好的地方
聚簇索引保證關(guān)鍵字的值相近的元祖存儲(chǔ)的物理位置也相近(所以字符串類型不宜簡(jiǎn)歷聚簇索引,特別是隨機(jī)字符串,會(huì)使系統(tǒng)進(jìn)行大量的移動(dòng)操作)
一般來(lái)說(shuō),DBMS都會(huì)以聚簇索引的形式來(lái)存儲(chǔ)實(shí)際的數(shù)據(jù),它是其他二級(jí)索引的基本:
- 聚簇索引(primary索引):主鍵索引
- 非聚簇索引(second索引):二級(jí)索引 聚簇索引的結(jié)構(gòu):
聚簇索引的結(jié)構(gòu):
節(jié)點(diǎn)頁(yè)只包含了索引列,葉子頁(yè)包含了行的全部數(shù)據(jù)。聚簇索引“就是表”,因此可以不需要獨(dú)立的行存儲(chǔ)
二級(jí)索引:葉子節(jié)點(diǎn)保存的不是指行的物理位置的指針,而是行的主鍵值 。
這意味著通過(guò)二級(jí)索引查找行,存儲(chǔ)引擎需要:
- 找到二級(jí)索引的葉子節(jié)點(diǎn)獲得對(duì)應(yīng)的主鍵值
- 根據(jù)這個(gè)主鍵值去聚簇索引中查找對(duì)應(yīng)的行。這里需要兩次B-Tree查找而不是一次。
覆蓋索引對(duì)于InnoDB表尤其有用,因?yàn)镮nnoDB使用聚簇索引組著數(shù)據(jù),如果二級(jí)索引中包含查詢所需的數(shù)據(jù),就不再需要在聚集索引中查找了。
聚簇索引(InnoDB)和二級(jí)索引(MyISAM)
數(shù)據(jù)布局比較:
CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
MyISAM
MyISAM按照插入的順序在磁盤上存儲(chǔ)數(shù)據(jù):
左邊為行號(hào)(row number),從0開始。因?yàn)樵M的大小固定,所以MyISAM可以很容易的從表的開始位置找到某一字節(jié)的位置。
MyISAM建立的索引結(jié)構(gòu)大致如下:
cod1主鍵索引:
MyISAM不支持聚簇索引,索引中每一個(gè)葉子節(jié)點(diǎn)僅僅包含行號(hào)(row number),且葉子節(jié)點(diǎn)按照col1的順序存儲(chǔ)。
col2非主鍵索引:
在MyISAM中,primary key和其他索引沒有什么區(qū)別。Primary key僅僅只是一個(gè)叫做PRIMARY的唯一,非空的索引而已,葉子節(jié)點(diǎn)按照col2的順序存儲(chǔ)。
InnoDB:
col1主鍵索引,即聚簇索引:
聚簇索引中的每個(gè)葉子節(jié)點(diǎn)包含主鍵的值,事務(wù)ID,用于事務(wù)和MVVC的回滾指針、余下的列
col2非主鍵索引,及二級(jí)索引
InnoDB的二級(jí)索引的葉子包含主鍵的值,而不是行指針(row pointers),這樣的策略減小了移動(dòng)數(shù)據(jù)或者數(shù)據(jù)頁(yè)面分裂時(shí)維護(hù)二級(jí)索引的開銷,因?yàn)镮nnoDB不需要更新索引的行指針。
到此這篇關(guān)于Mysql中的聚簇索引cluster index解析的文章就介紹到這了,更多相關(guān)Mysql聚簇索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法
JSR-303 是 JAVA EE 6 中的一項(xiàng)子規(guī)范,叫做 Bean Validation,官方參考實(shí)現(xiàn)是Hibernate Validator,這篇文章主要介紹了springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理,需要的朋友可以參考下2022-09-09
Nacos與SpringBoot實(shí)現(xiàn)配置管理的開發(fā)實(shí)踐
在微服務(wù)架構(gòu)中,配置管理是一個(gè)核心組件,而Nacos為此提供了一個(gè)強(qiáng)大的解決方案,本文主要介紹了Nacos與SpringBoot實(shí)現(xiàn)配置管理的開發(fā)實(shí)踐,具有一定的參考價(jià)值2023-08-08
一文詳解Java中的動(dòng)態(tài)填充Html模版并轉(zhuǎn)PDF
在后端技術(shù)中,模板引擎和PDF生成工具是兩個(gè)非常重要的領(lǐng)域,Thymeleaf和wkhtmltopdf是這兩個(gè)領(lǐng)域的杰出代表,下面就來(lái)詳細(xì)介紹一下Thymeleaf和wkhtmltopdf的技術(shù)特點(diǎn)吧2023-12-12
Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀
這篇文章主要介紹了Java線程中的用戶態(tài)和內(nèi)核態(tài)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
SpringBoot集成Spring Security用JWT令牌實(shí)現(xiàn)登錄和鑒權(quán)的方法
這篇文章主要介紹了SpringBoot集成Spring Security用JWT令牌實(shí)現(xiàn)登錄和鑒權(quán)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
springboot報(bào)錯(cuò)Invalid?bound?statement?(not?found)的解決
本文主要介紹了springboot報(bào)錯(cuò)Invalid?bound?statement?(not?found)的解決,遇到這種問(wèn)題通常是沒有配置好配置文件,下面就來(lái)具體介紹一下解決方法,感興趣的可以了解一下2025-03-03
SpringBoot實(shí)現(xiàn)版本升級(jí)到2.7.18
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)版本升級(jí)到2.7.18全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
淺談Maven鏡像更換為阿里云中央倉(cāng)庫(kù)(精)
本篇文章主要介紹了Maven鏡像更換為阿里云中央倉(cāng)庫(kù)(精),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

