天天看點

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

前言

看了很多關于索引的部落格,講的大同小異。但是始終沒有讓我明白關于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或許有很多人和我一樣,沒搞清楚概念就開始研究B-Tree,B+Tree等結構,導緻在面試的時候答非所問!

索引是什麼?

索引是幫助MySQL高效擷取資料的資料結構。

索引能幹什麼?

提高資料查詢的效率。

索引:排好序的快速查找資料結構!索引會影響where後面的查找,和order by 後面的排序。

一、索引的分類

1.從存儲結構上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。

2.從應用層次來分:普通索引,唯一索引,複合索引。

3.根據中資料的實體順序與鍵值的邏輯(索引)順序關系:聚集索引,非聚集索引。

1)中所描述的是索引存儲時儲存的形式,

2)是索引使用過程中進行的分類,兩者是不同層次上的劃分。不過平時講的索引類型一般是指在應用層次的劃分。

就像手機分類,安卓手機,IOS手機 與 華為手機,蘋果手機,OPPO手機一樣。

普通索引:即一個索引隻包含單個列,一個表可以有多個單列索引

唯一索引:索引列的值必須唯一,但允許有空值

複合索引:即一個索引包含多個列

聚簇索引(聚集索引):并不是一種單獨的索引類型,而是一種資料存儲方式。具體細節取決于不同的實作,InnoDB的聚簇索引其實就是在同一個結構中儲存了B-Tree索引(技術上來說是B+Tree)和資料行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(認真臉)。

歡迎大家關注我的公種浩【程式員追風】,文章都會在裡面更新,整理的資料也會放在裡面。

二、索引的底層實作

mysql預設存儲引擎innodb隻顯式支援B-Tree( 從技術上來說是B+Tree)索引,對于頻繁通路的表,innodb會透明建立自适應hash索引,即在B樹索引基礎上建立hash索引,可以顯著提高查找效率,對于用戶端是透明的,不可控制的,隐式的。

不談存儲引擎,隻讨論實作(抽象)

Hash索引

基于哈希表實作,隻有精确比對索引所有列的查詢才有效,對于每一行資料,存儲引擎都會對所有的索引列計算一個哈希碼(hash code),并且Hash索引将所有的哈希碼存儲在索引中,同時在索引表中儲存指向每個資料行的指針。

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

B-Tree能加快資料的通路速度,因為存儲引擎不再需要進行全表掃描來擷取資料,資料分布在各個節點之中。

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

是B-Tree的改進版本,同時也是資料庫索引索引所采用的存儲結構。資料都在葉子節點上,并且增加了順序通路指針,每個葉子節點都指向相鄰的葉子節點的位址。相比B-Tree來說,進行範圍查找時隻需要查找兩個節點,進行周遊即可。而B-Tree需要擷取所有節點,相比之下B+Tree效率更高。

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

案例:假設有一張學生表,id為主鍵

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

在MyISAM引擎中的實作(二級索引也是這樣實作的)

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

在InnoDB中的實作

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題
還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

三、問題

問:為什麼索引結構預設使用B-Tree,而不是hash,二叉樹,紅黑樹?

hash:雖然可以快速定位,但是沒有順序,IO複雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查找效率跟資料有關(樹的高度),并且IO代價高。

紅黑樹:樹的高度随着資料量增加而增加,IO代價高。

問:為什麼官方建議使用自增長主鍵作為索引。

結合B+Tree的特點,自增主鍵是連續的,在插入過程中盡量減少頁分裂,即使要進行頁分裂,也隻會分裂很少一部分。并且能減少資料的移動,每次插入都是插入到最後。總之就是減少分裂和移動的頻率。

插入連續的資料:

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

插入非連續的資料

還不懂MySQL索引?這1次徹底搞懂B+樹和B-樹前言索引是什麼?索引能幹什麼?一、索引的分類二、索引的底層實作三、問題

最後

歡迎大家一起交流,喜歡文章記得點個贊喲,感謝支援!