MySQL索引詳解(三)索引的底層原理

索引的總共有四種類型:BTree索引仍侥,HASH索引,F(xiàn)ullText索引和RTree索引
不同的存儲(chǔ)引擎使用是不同實(shí)現(xiàn)原理實(shí)現(xiàn)索引


目錄結(jié)構(gòu)
1鸳君、BTree索引
????(1)BTree簡(jiǎn)要介紹
????(2)B+Tree簡(jiǎn)要介紹
????(3)B+Tree實(shí)現(xiàn)索引
2农渊、HASH索引
3、FullText索引
4或颊、RTree索引


1砸紊、BTree索引(B+Tree索引)

(1)BTree簡(jiǎn)要介紹

BTree索引就是以BTree結(jié)構(gòu)實(shí)現(xiàn)的索引。
使用BTree結(jié)構(gòu)實(shí)現(xiàn)索引基本是每個(gè)數(shù)據(jù)庫(kù)索引結(jié)構(gòu)的首選囱挑,
(為什么都選擇使用BTree結(jié)構(gòu)而不是其他什么樹醉顽,如紅黑樹之類的,參照文章MySQL索引詳解(四)BTree為什么更適合做索引結(jié)構(gòu)
MySQL中除了Archive引存儲(chǔ)引擎外平挑,其他所有的存儲(chǔ)引擎都支持BTree索引游添。
BTree也叫平衡多路查找樹,與二叉樹的區(qū)別是BTree的節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)(可多于兩個(gè))通熄。

BTree結(jié)構(gòu)圖

BTree結(jié)構(gòu)中每個(gè)節(jié)點(diǎn)都有指針唆涝,key,value三個(gè)元素唇辨,如上圖空白框表示指針廊酣,15表示為key,data為value赏枚。

(2)B+Tree簡(jiǎn)要介紹

B+Tree結(jié)構(gòu)如下圖:


B+Tree

有圖可知亡驰,B+Tree與BTree的不同在于晓猛,B+Tree只有葉子節(jié)點(diǎn)存儲(chǔ)value,非葉子節(jié)點(diǎn)只有指針和key

一般在數(shù)據(jù)庫(kù)文件系統(tǒng)中凡辱,為了方便遍歷葉子節(jié)點(diǎn)戒职,對(duì)B+Tree做了小的改動(dòng),在葉子節(jié)點(diǎn)上增加了順序訪問指針煞茫。改動(dòng)后的結(jié)構(gòu)圖如下:


有順序訪問指正的B+Tree結(jié)構(gòu)圖
(3)B+Tree實(shí)現(xiàn)索引

MySQL數(shù)據(jù)庫(kù)中帕涌,最常用的兩個(gè)存儲(chǔ)引擎MyISAM和InnoDB存儲(chǔ)引擎實(shí)現(xiàn)BTree索引都是使用B+Tree結(jié)構(gòu)實(shí)現(xiàn)的。但是兩個(gè)存儲(chǔ)引擎實(shí)現(xiàn)的思路也不完全相同续徽,下面分別介紹兩個(gè)存儲(chǔ)引擎各自的實(shí)現(xiàn)思路蚓曼。

MyISAM存儲(chǔ)引擎的實(shí)現(xiàn)
(1)主鍵索引實(shí)現(xiàn)的主要思想:
節(jié)點(diǎn)上的key是主鍵,然后將每行數(shù)據(jù)的地址信息存放在B+Tree的葉子節(jié)點(diǎn)的value中钦扭。結(jié)構(gòu)圖如下:

MyISAM主鍵索引實(shí)現(xiàn)結(jié)構(gòu)圖

(2)非主鍵索引(普通索引或者唯一索引或組合索引)實(shí)現(xiàn)的主要思想:
節(jié)點(diǎn)上的key是索引行纫版,然后將每行數(shù)據(jù)的地址信息存放在B+Tree的葉子節(jié)點(diǎn)的value中。結(jié)構(gòu)圖如下(假設(shè)索引為col2):


MyISAM非主鍵索引實(shí)現(xiàn)結(jié)構(gòu)圖

InnoDB存儲(chǔ)引擎的實(shí)現(xiàn)
(1)主鍵索引實(shí)現(xiàn)的主要思想:
節(jié)點(diǎn)上的key是主鍵客情,直接將每行數(shù)據(jù)的信息存放在B+Tree的葉子節(jié)點(diǎn)的value中其弊,結(jié)構(gòu)圖如下:

InnoDB主鍵索引實(shí)現(xiàn)結(jié)構(gòu)圖

根據(jù)結(jié)構(gòu)可以看出,數(shù)據(jù)行本身存儲(chǔ)在B+Tree上膀斋,所有InnoDB要求每個(gè)表必須要有個(gè)主鍵梭伐,如果沒有添加,存儲(chǔ)引擎則會(huì)主動(dòng)默認(rèn)添加一個(gè)主鍵仰担。
這樣的存儲(chǔ)結(jié)構(gòu)被稱為“聚集索引”
聚集索引的優(yōu)點(diǎn)
可以索引覆蓋糊识,使效率更高
聚集索引的缺點(diǎn)
聚集索引的表在插入新行,或者主鍵被更新需要移動(dòng)的時(shí)候摔蓝,可能面臨頁分裂的問題
按照非主鍵索引查找赂苗,比較慢
主鍵id的長(zhǎng)度不能過長(zhǎng)限制
(2)非主鍵索引(普通索引或者唯一索引或組合索引)實(shí)現(xiàn)的主要思想:
節(jié)點(diǎn)上的key是索引列,每個(gè)葉子節(jié)點(diǎn)的value值存儲(chǔ)的是主鍵贮尉。結(jié)構(gòu)圖如下:
InnoDB主鍵索引實(shí)現(xiàn)結(jié)構(gòu)圖

根據(jù)上面的結(jié)構(gòu)可以看出拌滋,如果按照非主鍵索引來查找數(shù)據(jù),需要先在非主鍵索引結(jié)構(gòu)中查找到主鍵猜谚,然后再去主鍵索引結(jié)構(gòu)中再去拿出數(shù)據(jù)败砂。這個(gè)過程被稱為回表
平時(shí)如果我們只需要取出主鍵id龄毡,就不要用select*去執(zhí)行吠卷。因?yàn)閟elect id from user where name = "s"和select * from user where name = "s"相比少一步回表操作。

2沦零、HASH索引

MySQL存儲(chǔ)引擎中只有memory存儲(chǔ)引擎執(zhí)行HASH索引祭隔。
HASH索引是通過設(shè)計(jì)抗碰撞HASH算法,將索引的信息存儲(chǔ)在HASH表中。


HASH結(jié)構(gòu)

HASH索引優(yōu)點(diǎn):
等值查詢速度比BTree要快疾渴,因?yàn)橹恍枰鲆淮蜨ASH運(yùn)算即可
HASH索引缺點(diǎn):
只能進(jìn)行等值的查找千贯,不能進(jìn)行范圍查找
不能進(jìn)行模糊查找,只能對(duì)確定性的key值進(jìn)行查找
HASH算法的缺點(diǎn)搞坝,如果算法設(shè)計(jì)不夠精度搔谴,出現(xiàn)碰撞的情況,如果出現(xiàn)碰撞情況桩撮,就需要逐個(gè)遍歷整張表的每條數(shù)據(jù)

3敦第、FullText索引

FullText的底層也是使用BTree實(shí)現(xiàn)的,但是和普通的索引實(shí)現(xiàn)的原理是不同的店量。
僅MyISAM支持
FullText索引是將索引的列按照特定的算法芜果,將字段分割成幾部分(變成詞或詞組),然后對(duì)分割后的詞或詞組融师,進(jìn)行索引右钾。BTree中的節(jié)點(diǎn)存儲(chǔ)的信息如下:

FullText索引節(jié)點(diǎn)信息

FullText索引優(yōu)點(diǎn):
對(duì)于較長(zhǎng)的字符串,查詢效率要比like %...%效率更高
FullText索引缺點(diǎn):
創(chuàng)建FullText索引消耗的資源較大

4旱爆、RTree索引

RTree索引主要用來解決空間數(shù)據(jù)檢索問題
在MySQL5.0.16之前舀射,僅MyISAM支持,之后BDB怀伦,InnoDB等其他存儲(chǔ)引擎也支持

(1)脆烟、RTree結(jié)構(gòu)

RTree是BTree的多維版
RTree是Guttman在一片論文《R-trees: a dynamic index structure for spatial searching》中提出的為了解決空間查詢問題,而提出的房待。
RTree的結(jié)構(gòu)
RTree的結(jié)構(gòu)和BTree結(jié)構(gòu)類似浩淘,只不過上面存儲(chǔ)的信息不同,說清楚RTree上存儲(chǔ)的信息之前吴攒,先要介紹一下多維數(shù)據(jù)的查詢過程。
以二維數(shù)據(jù)為例砂蔽,RTree的目的就是要實(shí)現(xiàn)二維數(shù)據(jù)的的查找洼怔,如果要實(shí)現(xiàn)一個(gè)區(qū)域的查找,該如何實(shí)現(xiàn)呢左驾。假如有如下的區(qū)域:

區(qū)域圖

在整個(gè)大的區(qū)域中有三個(gè)區(qū)域D1镣隶,D2,D3三個(gè)不規(guī)則區(qū)域诡右,通過MBR(Minimal Bounding Rectangle--最小邊界矩形)方法將不規(guī)則的區(qū)域框起來安岂,變成R8,R9和R10帆吻,稱R8是D1的MBR域那。其他的實(shí)線框同理(可以認(rèn)為都是一些不規(guī)則區(qū)域的MBR,不規(guī)則區(qū)域省略)猜煮。然后再將距離近的幾個(gè)區(qū)域劃分到一個(gè)大的區(qū)域內(nèi)次员,如上圖中的R3包括(R8,R9,R10),同理R4(R9,R10,R12,R11)败许,R5(R14,R13),R6(R15,R16)淑蔚,R7(R17,R18,R19)市殷。然后再對(duì)R3,R4刹衫,R5醋寝,R6,R7進(jìn)行區(qū)域劃分带迟。得到R1(R3音羞,R4,R5)邮旷,R2(R6黄选,R7),然后按這樣層級(jí)關(guān)系婶肩,構(gòu)建一個(gè)RTree办陷,如下如:
RTree樹

非葉子節(jié)點(diǎn)存儲(chǔ)信息:區(qū)域R的信息和指向葉子節(jié)點(diǎn)的指針
葉子節(jié)點(diǎn)存儲(chǔ)信息:區(qū)域R的信息和區(qū)域D的信息
通過這個(gè)結(jié)構(gòu)可以很快的查出某個(gè)區(qū)域,查找過程同BTree律歼。
詳細(xì)信息參照參考資料



參考資料
1民镜、《MySQL性能調(diào)優(yōu)與架構(gòu)設(shè)計(jì)》
2、http://www.reibang.com/p/eb5c9c05f2d4
3险毁、http://www.reibang.com/p/0371c9569736
4制圈、空間數(shù)據(jù)索引RTree完全解析
5、R-trees: a dynamic index structure for spatial searching

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畔况,一起剝皮案震驚了整個(gè)濱河市鲸鹦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跷跪,老刑警劉巖馋嗜,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吵瞻,居然都是意外死亡葛菇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門橡羞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眯停,“玉大人,你說我怎么就攤上這事卿泽≥赫” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)九府。 經(jīng)常有香客問我椎瘟,道長(zhǎng),這世上最難降的妖魔是什么侄旬? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任肺蔚,我火速辦了婚禮,結(jié)果婚禮上儡羔,老公的妹妹穿的比我還像新娘宣羊。我一直安慰自己,他們只是感情好汰蜘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布仇冯。 她就那樣靜靜地躺著,像睡著了一般族操。 火紅的嫁衣襯著肌膚如雪苛坚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天色难,我揣著相機(jī)與錄音泼舱,去河邊找鬼。 笑死枷莉,一個(gè)胖子當(dāng)著我的面吹牛娇昙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笤妙,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冒掌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蹲盘?” 一聲冷哼從身側(cè)響起股毫,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎召衔,沒想到半個(gè)月后皇拣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄嫡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颗胡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毫深。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毒姨,靈堂內(nèi)的尸體忽然破棺而出哑蔫,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布闸迷,位于F島的核電站嵌纲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腥沽。R本人自食惡果不足惜逮走,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望今阳。 院中可真熱鬧师溅,春花似錦、人聲如沸盾舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妖谴。三九已至窿锉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膝舅,已是汗流浹背嗡载。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铸史,地道東北人鼻疮。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像琳轿,于是被迫代替她去往敵國(guó)和親判沟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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