你知道m(xù)ysql索引有哪些嗎江掩?大家肯定都能霹靂啪啦地說出聚簇索引学辱、主鍵索引乘瓤、二級(jí)索引、普通索引策泣、唯一索引衙傀、hash索引、B+樹索引等等萨咕。
把所有類型的索引放在一起大家不便于理解统抬,我們可以按照特性將索引可以大致的分一下類,我們可以按照兩個(gè)角度來分類索引
- 按「數(shù)據(jù)結(jié)構(gòu)」分類:B+tree索引危队、Hash索引聪建、Full-text索引。
- 按「索引特點(diǎn)」分類:主鍵索引茫陆、唯一索引金麸、普通索引、聯(lián)合索引
重點(diǎn)介紹
本文著重圍繞B+tree索引來介紹簿盅,其他的兩種數(shù)據(jù)結(jié)構(gòu)的索引贊不討論挥下。
B+tree其實(shí)是一種多叉樹結(jié)構(gòu),葉子節(jié)點(diǎn)存放數(shù)據(jù)桨醋,非葉子節(jié)點(diǎn)只存放索引棚瘟,
而且每個(gè)節(jié)點(diǎn)里的數(shù)據(jù)是按主鍵順序存放的。每一層父節(jié)點(diǎn)的索引值都會(huì)出現(xiàn)在下層子節(jié)點(diǎn)的索引值中讨盒,因此在葉子節(jié)點(diǎn)中解取,包括了所有的索引值信息,并且每一個(gè)葉子節(jié)點(diǎn)都有兩個(gè)指針返顺,分別指向下一個(gè)葉子節(jié)點(diǎn)和上一個(gè)葉子節(jié)點(diǎn)禀苦,形成一個(gè)雙向鏈表。如下圖是主鍵索引B+tree結(jié)構(gòu)
這種結(jié)構(gòu)有什么優(yōu)點(diǎn)呢遂鹊?
- 相對(duì)于二叉樹來說它更扁平振乏,也意味查詢數(shù)據(jù)產(chǎn)生的IO次數(shù)會(huì)更少,3-4層能輕松容納千萬級(jí)別數(shù)據(jù)
- 相對(duì)于B樹結(jié)構(gòu)秉扑,B+Tree 只在葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)慧邮,而 B 樹 的非葉子節(jié)點(diǎn)也要存儲(chǔ)數(shù)據(jù),所以 B+Tree 的單個(gè)節(jié)點(diǎn)的數(shù)據(jù)量更小舟陆,在相同的磁盤 I/O 次數(shù)下误澳,就能查詢更多的節(jié)點(diǎn)。另外秦躯,B+Tree 葉子節(jié)點(diǎn)采用的是雙鏈表連接忆谓,適合 MySQL 中常見的基于范圍的順序查找,而 B 樹無法做到這一點(diǎn)踱承。
索引特點(diǎn)
1.主鍵索引
主鍵索引就是建立在主鍵字段上的索引倡缠,通常在創(chuàng)建表的時(shí)候一起創(chuàng)建哨免,一張表最多只有一個(gè)主鍵索引,索引列的值不允許有空值
2.唯一索引建
唯一索引建立在 UNIQUE 字段上的索引昙沦,一張表可以有多個(gè)唯一索引琢唾,索引列的值必須唯一,但是允許有空值
3.普通索引
普通索引就是建立在普通字段上的索引盾饮,既不要求字段為主鍵采桃,也不要求字段為 UNIQUE
4.前綴索引
前綴索引是指對(duì)字符類型字段的前幾個(gè)字符建立的索引,而不是在整個(gè)字段上建立的索引丘损,前綴索引可以建立在字段類型為 char芍碧、 varchar、binary号俐、varbinary 的列上。使用前綴索引的目的是為了減少索引占用的存儲(chǔ)空間定庵,提升查詢效率
5.聯(lián)合索引
通過將多個(gè)字段組合成一個(gè)索引吏饿,該索引就被稱為聯(lián)合索引,使用聯(lián)合索引時(shí)蔬浙,存在最左匹配原則猪落,也就是按照最左優(yōu)先的方式進(jìn)行索引的匹配。在使用聯(lián)合索引進(jìn)行查詢的時(shí)候畴博,如果不遵循「最左匹配原則」笨忌,聯(lián)合索引會(huì)失效,這樣就無法利用到索引快速查詢的特性了俱病。常見的優(yōu)化方式官疲,將查詢的列放到聯(lián)合索引中可以避免回表來提升性能,注意這個(gè)查詢列需要避免過長(zhǎng)的字段亮隙,否則會(huì)導(dǎo)致索引文件過大降低IO性能