Mysql中的聚簇索引cluster index解析
聚簇索引(cluster index)
一個表只能有一個聚簇索引。
目前,只有solidDB和InnoDB支持聚簇索引,MyISAM不支持聚簇索引。一些DBMS允許用戶指定聚簇索引,但是MySQL的存儲引擎到目前為止都不支持。
InnoDB的聚簇索引:
- InnoDB對主鍵建立聚簇索引。
- 如果你不指定主鍵,InnoDB會用一個具有唯一且非空值的索引來代替。
- 如果不存在這樣的索引,InnoDB會定義一個隱藏的主鍵,然后對其建立聚簇索引
InnoDB默認(rèn)使用聚簇索引來組織數(shù)據(jù),如果你用InnoDB,而且不需要特殊的聚簇索引,一個好的做法就是使用代理主鍵(surrogate key)—獨(dú)立于你的應(yīng)用中的數(shù)據(jù)。最簡單的做法就是使用一個AUTO_INCREMENT的列,這會保證記錄按照順序插入,而且能提高使用primary_key進(jìn)行連接的查詢的性能。應(yīng)該盡量避免隨機(jī)的聚簇主鍵,例如字符串主鍵就是一個不好的選擇,它使得插入操作變得隨機(jī)
變得隨機(jī)的不好的地方
聚簇索引保證關(guān)鍵字的值相近的元祖存儲的物理位置也相近(所以字符串類型不宜簡歷聚簇索引,特別是隨機(jī)字符串,會使系統(tǒng)進(jìn)行大量的移動操作)
一般來說,DBMS都會以聚簇索引的形式來存儲實(shí)際的數(shù)據(jù),它是其他二級索引的基本:
- 聚簇索引(primary索引):主鍵索引
- 非聚簇索引(second索引):二級索引 聚簇索引的結(jié)構(gòu):
聚簇索引的結(jié)構(gòu):
節(jié)點(diǎn)頁只包含了索引列,葉子頁包含了行的全部數(shù)據(jù)。聚簇索引“就是表”,因此可以不需要獨(dú)立的行存儲
二級索引:葉子節(jié)點(diǎn)保存的不是指行的物理位置的指針,而是行的主鍵值 。
這意味著通過二級索引查找行,存儲引擎需要:
- 找到二級索引的葉子節(jié)點(diǎn)獲得對應(yīng)的主鍵值
- 根據(jù)這個主鍵值去聚簇索引中查找對應(yīng)的行。這里需要兩次B-Tree查找而不是一次。
覆蓋索引對于InnoDB表尤其有用,因?yàn)镮nnoDB使用聚簇索引組著數(shù)據(jù),如果二級索引中包含查詢所需的數(shù)據(jù),就不再需要在聚集索引中查找了。
聚簇索引(InnoDB)和二級索引(MyISAM)
數(shù)據(jù)布局比較:
CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
MyISAM
MyISAM按照插入的順序在磁盤上存儲數(shù)據(jù):
左邊為行號(row number),從0開始。因?yàn)樵M的大小固定,所以MyISAM可以很容易的從表的開始位置找到某一字節(jié)的位置。
MyISAM建立的索引結(jié)構(gòu)大致如下:
cod1主鍵索引:
MyISAM不支持聚簇索引,索引中每一個葉子節(jié)點(diǎn)僅僅包含行號(row number),且葉子節(jié)點(diǎn)按照col1的順序存儲。
col2非主鍵索引:
在MyISAM中,primary key和其他索引沒有什么區(qū)別。Primary key僅僅只是一個叫做PRIMARY的唯一,非空的索引而已,葉子節(jié)點(diǎn)按照col2的順序存儲。
InnoDB:
col1主鍵索引,即聚簇索引:
聚簇索引中的每個葉子節(jié)點(diǎn)包含主鍵的值,事務(wù)ID,用于事務(wù)和MVVC的回滾指針、余下的列
col2非主鍵索引,及二級索引
InnoDB的二級索引的葉子包含主鍵的值,而不是行指針(row pointers),這樣的策略減小了移動數(shù)據(jù)或者數(shù)據(jù)頁面分裂時(shí)維護(hù)二級索引的開銷,因?yàn)镮nnoDB不需要更新索引的行指針。
到此這篇關(guān)于Mysql中的聚簇索引cluster index解析的文章就介紹到這了,更多相關(guān)Mysql聚簇索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03SpringBoot如何使用ApplicationContext獲取bean對象
這篇文章主要介紹了SpringBoot 如何使用ApplicationContext獲取bean對象,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Java讀取一行空格隔開的數(shù)字字符串并求出這些數(shù)字的和方法
今天小編就為大家分享一篇Java讀取一行空格隔開的數(shù)字字符串并求出這些數(shù)字的和方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07JavaFX程序初次運(yùn)行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解
這篇文章主要介紹了JavaFX程序初次運(yùn)行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08SpringSecurity實(shí)現(xiàn)權(quán)限認(rèn)證與授權(quán)的使用示例
本文主要介紹了SpringSecurity實(shí)現(xiàn)權(quán)限認(rèn)證與授權(quán)的使用示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11Java中的clone方法詳解_動力節(jié)點(diǎn)Java學(xué)院整理
clone顧名思義就是復(fù)制, 在Java語言中, clone方法被對象調(diào)用,所以會復(fù)制對象。下面通過本文給大家介紹java中的clone方法,感興趣的朋友一起看看吧2017-06-06多模塊項(xiàng)目引入SpringSecurity后一直報(bào)404的解決方案
這篇文章主要介紹了多模塊項(xiàng)目引入SpringSecurity后一直報(bào)404的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06