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