概述
本文主要介紹MySQL數(shù)據(jù)庫的索引分類胡本。由于不同的分類角度導(dǎo)致容易混淆既们。
按數(shù)據(jù)結(jié)構(gòu)劃分
-
hash索引
MySQL并沒有顯式支持Hash索引,而是作為內(nèi)部的一種優(yōu)化庶香。具體在Innodb存儲引擎里四敞,會監(jiān)控對表上二級索引的查找泛源,如果發(fā)現(xiàn)某二級索引被頻繁訪問,二級索引成為熱數(shù)據(jù)忿危,就為之建立hash索引达箍。因此,在MySQL的Innodb里铺厨,對于熱點的數(shù)據(jù)會自動生成Hash索引缎玫。這種hash索引硬纤,根據(jù)其使用的場景特點,也叫自適應(yīng)Hash索引赃磨。
-
B+樹索引
這個是MySQL索引的基本實現(xiàn)方式筝家。Innodb、MyISAM的索引都是通過B+樹實現(xiàn)的邻辉。
按索引字段個數(shù)劃分
-
單值索引
僅包含一個字段值得索引溪王,稱為單值索引。
-
復(fù)核索引
包含多個字段構(gòu)成的索引值骇,成為復(fù)核索引莹菱。復(fù)合索引的索引的數(shù)據(jù)順序跟字段的順序相關(guān),包含多個值的索引中吱瘩,如果當(dāng)前面字段的值重復(fù)時道伟,將會按照其后面的值進行排序。
如果查詢條件中字段包含了復(fù)核索引中的字段使碾,優(yōu)化器也會按照索引字段順序進行解析蜜徽。單如果是不連續(xù)的則無法完全利用索引。比如建立(a,b,c)的復(fù)核索引部逮,如果查找條件為(a,c),則只能利用a的索引娜汁。
按是否是主鍵劃分
-
主鍵索引
MySQL中是根據(jù)主鍵來組織數(shù)據(jù)的,所以每張表都必須有主鍵索引兄朋,主鍵索引只能有一個,不能為null同時必須保證唯一性怜械。建表時如果沒有指定主鍵索引颅和,則會自動生成一個隱藏的字段作為主鍵索引。
-
輔助索引/二級索引
如果不是主鍵索引缕允,則就可以稱之為非主鍵索引峡扩,又可以稱之為輔助索引或者二級索引。主鍵索引的葉子節(jié)點存儲了完整的數(shù)據(jù)行障本,而非主鍵索引的葉子節(jié)點存儲的則是主鍵索引值教届。
通過非主鍵索引查詢數(shù)據(jù)時,會先查找到主鍵索引值驾霜,然后再到主鍵索引上去查找對應(yīng)的數(shù)據(jù)案训。這也是不建議主鍵太長的原因,因為所有輔助索引都會存儲主鍵粪糙。
索引是否包括返回值
-
覆蓋索引
在這里假設(shè)我們有張表user强霎,具有三列:ID,age蓉冈,name城舞,create_time轩触,id是主鍵,(age家夺,create_time,脱柱,name)建立輔助索引。
執(zhí)行如下sql語句
select name from user where age>2 order by create_time desc拉馋。
正常的話榨为,查詢分兩步:
1 按照輔助索引,查找到記錄的主鍵
2 按照主鍵主鍵索引里查找記錄椅邓,返回name柠逞。
但實際上,我們可以看到景馁,輔助索引節(jié)點是按照age板壮,create_time,name建立的合住,索引信息里完全包含我們所要的信息绰精,如果能從輔助索引里返回name信息,則第二步是完全沒有必要的透葛,可以極大提升查詢速度笨使。
按照這種思想Innodb里針對使用輔助索引的查詢場景做了優(yōu)化,叫覆蓋索引僚害。
索引與數(shù)據(jù)的存儲關(guān)聯(lián)性
-
聚簇索引
Innodb中的主鍵索引(B+樹索引)結(jié)構(gòu)中硫椰,非葉子節(jié)點存儲的是索引指針,葉子節(jié)點存儲的是既有索引也有整行數(shù)據(jù)萨蚕。索引和數(shù)據(jù)是存儲在一起的靶草,是典型的聚簇索引。
-
非聚簇索引
innodb中的輔助索引結(jié)構(gòu)中岳遥,葉子節(jié)點存儲的是主鍵索引值奕翔,并沒有完整數(shù)據(jù),所以為非聚簇索引浩蓉。
MyISAM中索引和數(shù)據(jù)文件分開存儲派继,B+Tree的葉子節(jié)點存儲的是數(shù)據(jù)存放的地址,而不是具體的數(shù)據(jù)捻艳,是典型的非聚簇索引驾窟;換言之,數(shù)據(jù)可以在磁盤上隨便找地方存讯泣,索引也可以在磁盤上隨便找地方存纫普,只要葉子節(jié)點記錄對了數(shù)據(jù)存放地址就行。因此,索引存儲順序和數(shù)據(jù)存儲關(guān)系毫無關(guān)聯(lián)昨稼,是典型的非聚簇索引节视。
其他分類
- 全文索引
- 唯一索引:索引唯一。