mysql 聚簇索引與非聚簇索引

聚簇索引并不是一種單獨(dú)的索引類型邪蛔,而是一種數(shù)據(jù)存儲方式蜂大。具體細(xì)節(jié)依賴于其實(shí)現(xiàn)方式皆疹。

MySQL數(shù)據(jù)庫中innodb存儲引擎疏橄,B+樹索引可以分為聚簇索引(也稱聚集索引,clustered index)和輔助索引(有時也稱非聚簇索引或二級索引略就,secondary index捎迫,non-clustered index)。

這兩種索引內(nèi)部都是B+樹表牢,聚集索引的葉子節(jié)點(diǎn)存放著一整行的數(shù)據(jù)窄绒。

Innobd中的主鍵索引是一種聚簇索引,非聚簇索引都是輔助索引崔兴,像復(fù)合索引彰导、前綴索引、唯一索引敲茄。

Innodb使用的是聚簇索引位谋,MyISam使用的是非聚簇索引


聚簇索引(聚集索引)

聚簇索引就是按照每張表的主鍵構(gòu)造一顆B+樹,同時葉子節(jié)點(diǎn)中存放的就是整張表的行記錄數(shù)據(jù)堰燎,也將聚集索引的葉子節(jié)點(diǎn)稱為數(shù)據(jù)頁掏父。這個特性決定了索引組織表中數(shù)據(jù)也是索引的一部分,每張表只能擁有一個聚簇索引秆剪。

Innodb通過主鍵聚集數(shù)據(jù)损同,如果沒有定義主鍵翩腐,innodb會選擇非空的唯一索引代替。如果沒有這樣的索引膏燃,innodb會隱式的定義一個主鍵來作為聚簇索引茂卦。


聚簇索引的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1.數(shù)據(jù)訪問更快,因?yàn)榫鄞厮饕龑⑺饕蛿?shù)據(jù)保存在同一個B+樹中组哩,因此從聚簇索引中獲取數(shù)據(jù)比非聚簇索引更快

2.聚簇索引對于主鍵的排序查找和范圍查找速度非车攘快

缺點(diǎn):

1.插入速度嚴(yán)重依賴于插入順序,按照主鍵的順序插入是最快的方式伶贰,否則將會出現(xiàn)頁分裂蛛砰,嚴(yán)重影響性能。因此黍衙,對于InnoDB表泥畅,我們一般都會定義一個自增的ID列為主鍵

2.更新主鍵的代價很高,因?yàn)閷?dǎo)致被更新的行移動琅翻。因此位仁,對于InnoDB表,我們一般定義主鍵為不可更新方椎。

3.二級索引訪問需要兩次索引查找聂抢,第一次找到主鍵值,第二次根據(jù)主鍵值找到行數(shù)據(jù)棠众。


輔助索引(非聚簇索引)

在聚簇索引之上創(chuàng)建的索引稱之為輔助索引琳疏,輔助索引訪問數(shù)據(jù)總是需要二次查找。輔助索引葉子節(jié)點(diǎn)存儲的不再是行的物理位置闸拿,而是主鍵值空盼。通過輔助索引首先找到的是主鍵值,再通過主鍵值找到數(shù)據(jù)行的數(shù)據(jù)頁新荤,再通過數(shù)據(jù)頁中的Page Directory找到數(shù)據(jù)行揽趾。

Innodb輔助索引的葉子節(jié)點(diǎn)并不包含行記錄的全部數(shù)據(jù),葉子節(jié)點(diǎn)除了包含鍵值外迟隅,還包含了相應(yīng)行數(shù)據(jù)的聚簇索引鍵但骨。

輔助索引的存在不影響數(shù)據(jù)在聚簇索引中的組織,所以一張表可以有多個輔助索引智袭。在innodb中有時也稱輔助索引為二級索引奔缠。


索引對比


Innodb聚簇索引和MyIsam非聚簇索引的比較說明

參考博客:https://www.cnblogs.com/zlcxbb/p/5757245.html

InnoDB索引實(shí)現(xiàn)

InnoDB也使用B+Tree作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與MyISAM截然不同.

1)主鍵索引:

MyISAM索引文件和數(shù)據(jù)文件是分離的吼野,索引文件僅保存數(shù)據(jù)記錄的地址校哎。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu),這棵樹的葉節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄闷哆。這個索引的key是數(shù)據(jù)表的主鍵腰奋,因此InnoDB表數(shù)據(jù)文件本身就是主索引。


圖inndb主鍵索引

(圖inndb主鍵索引)是InnoDB主索引(同時也是數(shù)據(jù)文件)的示意圖抱怔,可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄劣坊。這種索引叫做聚集索引。因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集屈留,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)局冰,如果沒有顯式指定,則MySQL系統(tǒng)會自動選擇一個可以唯一標(biāo)識數(shù)據(jù)記錄的列作為主鍵灌危,如果不存在這種列康二,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節(jié)勇蝙,類型為長整形沫勿。

2)InnoDB的輔助索引

? InnoDB的所有輔助索引都引用主鍵作為data域。例如味混,下圖為定義在Col3上的一個輔助索引:


輔助索引

InnoDB 表是基于聚簇索引建立的产雹。因此InnoDB 的索引能提供一種非常快速的主鍵查找性能惜傲。不過洽故,它的輔助索引(Secondary Index贝攒, 也就是非主鍵索引)也會包含主鍵列盗誊,所以,如果主鍵定義的比較大隘弊,其他索引也將很大哈踱。如果想在表上定義 、很多索引梨熙,則爭取盡量把主鍵定義得小一些开镣。InnoDB 不會壓縮索引。

文字符的ASCII碼作為比較準(zhǔn)則咽扇。聚集索引這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效邪财,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄质欲。

不同存儲引擎的索引實(shí)現(xiàn)方式對于正確使用和優(yōu)化索引都非常有幫助树埠,例如知道了InnoDB的索引實(shí)現(xiàn)后,就很容易明白

1嘶伟、為什么不建議使用過長的字段作為主鍵怎憋,因?yàn)樗休o助索引都引用主索引,過長的主索引會令輔助索引變得過大。

再例如绊袋,2毕匀、用非單調(diào)的字段作為主鍵在InnoDB中不是個好主意,因?yàn)镮nnoDB數(shù)據(jù)文件本身是一顆B+Tree癌别,非單調(diào)的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整皂岔,十分低效,而使用自增字段作為主鍵則是一個很好的選擇展姐。

InnoDB使用的是聚簇索引凤薛,將主鍵組織到一棵B+樹中,而行數(shù)據(jù)就儲存在葉子節(jié)點(diǎn)上诞仓,若使用"where id = 14"這樣的條件查找主鍵缤苫,則按照B+樹的檢索算法即可查找到對應(yīng)的葉節(jié)點(diǎn),之后獲得行數(shù)據(jù)墅拭。若對Name列進(jìn)行條件搜索活玲,則需要兩個步驟:第一步在輔助索引B+樹中檢索Name,到達(dá)其葉子節(jié)點(diǎn)獲取對應(yīng)的主鍵谍婉。第二步使用主鍵在主索引B+樹種再執(zhí)行一次B+樹檢索操作舒憾,最終到達(dá)葉子節(jié)點(diǎn)即可獲取整行數(shù)據(jù)。

MyISAM索引實(shí)現(xiàn)

MyISAM索引文件和數(shù)據(jù)文件是分離的穗熬,索引文件僅保存數(shù)據(jù)記錄的地址

1)主鍵索引:

MyISAM引擎使用B+Tree作為索引結(jié)構(gòu)镀迂,葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。下圖是MyISAM主鍵索引的原理圖:


MyISAM主鍵索引的原理圖

這里設(shè)表一共有三列唤蔗,假設(shè)我們以Col1為主鍵探遵,圖myisam1是一個MyISAM表的主索引(Primary key)示意〖斯瘢可以看出MyISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址箱季。

2)輔助索引(Secondary key)

在MyISAM中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別棍掐,只是主索引要求key是唯一的藏雏,而輔助索引的key可以重復(fù)。如果我們在Col2上建立一個輔助索引作煌,則此索引的結(jié)構(gòu)如下圖所示:

同樣也是一顆B+Tree掘殴,data域保存數(shù)據(jù)記錄的地址。因此粟誓,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引奏寨,如果指定的Key存在,則取出其data域的值努酸,然后以data域的值為地址服爷,讀取相應(yīng)數(shù)據(jù)記錄。

MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分仍源。

MyISM使用的是非聚簇索引心褐,非聚簇索引的兩棵B+樹看上去沒什么不同,節(jié)點(diǎn)的結(jié)構(gòu)完全一致只是存儲的內(nèi)容不同而已笼踩,主鍵索引B+樹的節(jié)點(diǎn)存儲了主鍵逗爹,輔助鍵索引B+樹存儲了輔助鍵。表數(shù)據(jù)存儲在獨(dú)立的地方嚎于,這兩顆B+樹的葉子節(jié)點(diǎn)都使用一個地址指向真正的表數(shù)據(jù)掘而,對于表數(shù)據(jù)來說,這兩個鍵沒有任何差別于购。由于索引樹是獨(dú)立的袍睡,通過輔助鍵檢索無需訪問主鍵的索引樹。

為了更形象說明這兩種索引的區(qū)別肋僧,我們假想一個表如下圖存儲了4行數(shù)據(jù)斑胜。其中Id作為主索引,Name作為輔助索引嫌吠。圖示清晰的顯示了聚簇索引和非聚簇索引的差異止潘。


問題:主鍵索引是聚集索引還是非聚集索引?

在Innodb下主鍵索引是聚集索引辫诅,在Myisam下主鍵索引是非聚集索引

聚簇索引和非聚簇索引的區(qū)別

聚簇索引的葉子節(jié)點(diǎn)存放的是主鍵值和數(shù)據(jù)行凭戴,支持覆蓋索引;二級索引的葉子節(jié)點(diǎn)存放的是主鍵值或指向數(shù)據(jù)行的指針炕矮。

由于節(jié)子節(jié)點(diǎn)(數(shù)據(jù)頁)只能按照一顆B+樹排序么夫,故一張表只能有一個聚簇索引。輔助索引的存在不影響聚簇索引中數(shù)據(jù)的組織吧享,所以一張表可以有多個輔助索引魏割。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末譬嚣,一起剝皮案震驚了整個濱河市钢颂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拜银,老刑警劉巖殊鞭,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尼桶,居然都是意外死亡操灿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門泵督,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾盐,“玉大人,你說我怎么就攤上這事【壤穑” “怎么了久窟?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長本缠。 經(jīng)常有香客問我斥扛,道長,這世上最難降的妖魔是什么丹锹? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任稀颁,我火速辦了婚禮,結(jié)果婚禮上楣黍,老公的妹妹穿的比我還像新娘匾灶。我一直安慰自己,他們只是感情好租漂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布粘昨。 她就那樣靜靜地躺著,像睡著了一般窜锯。 火紅的嫁衣襯著肌膚如雪张肾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天锚扎,我揣著相機(jī)與錄音吞瞪,去河邊找鬼。 笑死驾孔,一個胖子當(dāng)著我的面吹牛芍秆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翠勉,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妖啥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了对碌?” 一聲冷哼從身側(cè)響起荆虱,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朽们,沒想到半個月后怀读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骑脱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年菜枷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叁丧。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啤誊,死狀恐怖岳瞭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚊锹,我是刑警寧澤寝优,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站枫耳,受9級特大地震影響乏矾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迁杨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一钻心、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铅协,春花似錦捷沸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骏全,卻和暖如春苍柏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姜贡。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工试吁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楼咳。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓熄捍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親母怜。 傳聞我的和親對象是個殘疾皇子余耽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容