圖解MySQL索引——B-Tree(B+Tree)

2020-12-24 程式設計師面試經驗分享

技術乾貨,第一時間推送

作者:浪人~來源:https://www.cnblogs.com/liqiangchn/p/9060521.html

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

一、索引是什麼?

索引是幫助MySQL高效獲取數據的數據結構。

二、索引能幹什麼?

索引非常關鍵,尤其是當表中的數據量越來越大時,索引對於性能的影響愈發重要。索引能夠輕易將查詢性能提高好幾個數量級,總的來說就是可以明顯的提高查詢效率。

三、索引的分類?

1、從存儲結構上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。這裡所描述的是索引存儲時保存的形式,

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

3、根據中數據的物理順序與鍵值的邏輯(索引)順序關係:聚集索引,非聚集索引。

平時講的索引類型一般是指在應用層次的劃分。

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

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

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

複合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併

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

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底層實現

mysql默認存儲引擎innodb只顯式支持B-Tree( 從技術上來說是B+Tree)索引,對於頻繁訪問的表,innodb會透明建立自適應hash索引,即在B樹索引基礎上建立hash索引,可以顯著提高查找效率,對於客戶端是透明的,不可控制的,隱式的。

不談存儲引擎,只討論實現(抽象)

Hash索引

基於哈希表實現,只有精確匹配索引所有列的查詢才有效,對於每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼(hash code),並且Hash索引將所有的哈希碼存儲在索引中,同時在索引表中保存指向每個數據行的指針。

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快數據的訪問速度,因為存儲引擎不再需要進行全表掃描來獲取數據,數據分布在各個節點之中。

B+Tree索引

是B-Tree的改進版本,同時也是資料庫索引索引所採用的存儲結構。數據都在葉子節點上,並且增加了順序訪問指針,每個葉子節點都指向相鄰的葉子節點的地址。相比B-Tree來說,進行範圍查找時只需要查找兩個節點,進行遍歷即可。而B-Tree需要獲取所有節點,相比之下B+Tree效率更高。(排序查找算法系統的學習,可以在Java知音公眾號回復「排序算法聚合」)

結合存儲引擎來討論(一般默認使用B+Tree)

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

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

在InnoDB中的實現

五、為什麼索引結構默認使用B+Tree,而不是Hash,二叉樹,紅黑樹?

B-tree:因為B樹不管葉子節點還是非葉子節點,都會保存數據,這樣導致在非葉子節點中能保存的指針數量變少(有些資料也稱為扇出),指針少的情況下要保存大量數據,只能增加樹的高度,導致IO操作變多,查詢性能變低;

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

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

紅黑樹:樹的高度隨著數據量增加而增加,IO代價高。

六、為什麼官方建議使用自增長主鍵作為索引?

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

插入連續的數據:

插入非連續的數據:

七、簡單總結下

1、MySQL使用B+Tree作為索引數據結構。

2、B+Tree在新增數據時,會根據索引指定列的值對舊的B+Tree做調整。

4、從物理存儲結構上說,B-Tree和B+Tree都以頁(4K)來劃分節點的大小,但是由於B+Tree中中間節點不存儲數據,因此B+Tree能夠在同樣大小的節點中,存儲更多的key,提高查找效率。

5、影響MySQL查找性能的主要還是磁碟IO次數,大部分是磁頭移動到指定磁軌的時間花費。

6、MyISAM存儲引擎下索引和數據存儲是分離的,InnoDB索引和數據存儲在一起。

7、InnoDB存儲引擎下索引的實現,(輔助索引)全部是依賴於主索引建立的(輔助索引中葉子結點存儲的並不是數據的地址,還是主索引的值,因此,所有依賴於輔助索引的都是先根據輔助索引查到主索引,再根據主索引查數據的地址)。

8、由於InnoDB索引的特性,因此如果主索引不是自增的(id作主鍵),那麼每次插入新的數據,都很可能對B+Tree的主索引進行重整,影響性能。因此,儘量以自增id作為InnoDB的主索引。

-解讀源碼-

知其然並知其所以然

相關焦點

  • Mysql自增id用完了,到底會不會報錯?
    說實話,工作這麼多年,我還真沒遇到這種問題,也沒太想過,我的第一反應應該是會報錯,否則mysql也不會有那麼多類型和長度的限制;但是同時我也很疑惑,說不定mysql有什麼保護機制,可以自動升級類型之類的,接下來我將帶領大家去一層層揭開這個疑點。我們可以想一下,資料庫為什麼需要主鍵?不需要主鍵行不行?
  • MySQL 的 in 查詢不走索引?我拿什麼拯救你!
    於是下面就有幾個回答說 MySQL 查詢 in 是不走索引的! 哇,我驚呆了。這種話都出來了!我想證明我是錯的,於是我到網上搜索了非常多的文章,什麼 MySQL 優化實戰,MySQL 軍規 36 條,30條SQL優化軍規,SQL語句優化原則,mysql語句優化建議,資料庫查詢優化方法總結等等有非常多的文章在描述,MySQL 中 in 查詢不走索引。
  • 來自臺灣的三人組合Elephant Gym(大象體操)在Audiotree的演出現場
    Awards for best album, best rock single, and best jazz single.Recorded on March 18, 2019 in Chicago, IL.Visit the band's website → https://elephant-gym.bandcamp.com/Youtube Playlist → http://bit.ly/2FBeIZb⎻
  • MySQL怎麼刪除#sql開頭的臨時表
    例如,在對一張表(大表)添加索引時中途中斷、磁碟不足導致異常或正在添加索引時實例被kill等等情況所致。注意: 此類表空間文件不能直接rm -f的方式物理刪除,因為該信息記錄在ibdata的共享表空間裡,直接刪除後,後續實例重啟時會出現錯誤。3.
  • Lesson 14 2-3-4 Tree and Red-Black Tree
    Review2-3-4 tree transform to red-black tree:
  • 檸檬樹 |《Lemon Tree》
    曲子清新歡快,如果你有什麼煩惱和不快,學著唱一曲Lemon tree把煩惱統統丟掉吧!I wonder how I wonder whyYesterday you told me about the blue blue skyAnd all that I can see is just a yellow lemon tree
  • 等一個人讀書——A boy and his tree
    boy loved to come and play around it every day.He climbed to the tree top,ate the apples,took a nap under the shadow… He loved the tree and the tree loved to play with him.
  • 英文故事——The Apple Tree
    He climbed to the tree top, ate the apples, played under the tree... He loved the tree and the tree loved to play with him.
  • 聽歌學英文| Lemon Tree
    但你終究沒有出現,我感到詫異鬱悶I wonder how I wonder why我不知所措 我不明所以Yesterday you told me about the blue blue sky分明昨天你還與我談論美麗的天氣And all that I can see is just a yellow lemon tree
  • 英文繪本閱讀|
    >And the boy grew older孩子逐漸長大And the tree was often alone 大樹常常感到孤寂Then one day the boy came to the tree
  • 英文歌曲 Lemon Tree
    但什麼也沒有發生 我很詫異I wonder how I wonder why我不知道怎麼了 我也不明白為什麼Yesterday you told me about the blue blue sky昨天你還跟我說天空好藍好藍And all that I can see is just a yellow lemon tree
  • b樹和b+樹有什麼不同 b樹和b+樹特點區別匯總
    首頁 > 問答 > 關鍵詞 > b樹最新資訊 > 正文 b樹和b+樹有什麼不同 b樹和b+樹特點區別匯總
  • 英語歌曲 || Lemon Tree
    但你終究沒有出現,我感到詫異鬱悶I wonder how I wonder why我不知所措 我不明所以Yesterday you told me about the blue blue sky分明昨天你還與我談論美麗的天氣And all that I can see is just a yellow lemon tree
  • 熟詞生義:「up a tree」的含義和「樹」沒關係!
    大家好,今天我們那分享一個非常有用且地道的表達——up a tree, 這個短語的含義不是指「上樹」,其正確的含義是:up a tree 進退兩難,處於困境I’m really up a tree on
  • MySQL性能優化
    (定位慢查詢)首先我們了解mysql資料庫的一些運行狀態如何查詢(比如想知道當前mysql運行的時間/一共執行了多少次select/update/delete.. / 當前連接)為了便於測試,我們構建一個大表(400 萬)-> 使用存儲過程構建默認情況下,mysql認為10秒才是一個慢查詢.修改mysql的慢查詢.
  • 英文繪本故事|愛心樹 The Giving Tree
    Then one day the boy came to the tree有一天男孩來看大樹, and the tree said, "Come And the tree was happy. 大樹很快樂。
  • 音樂思想家 | 《Lemon tree》
    來聽這段歌詞:I wonder how I wonder why我不知所措 我不明所以Yesterday you told me about the blue blue sky昨天你分明還與我談論藍藍的天空And all that I can see is just a yellow lemon tree
  • 【經典音樂】流行歌曲《Lemon Tree(檸檬樹)》
    Yesterday you told me about the blue, blue sky.  昨天你給我描繪那藍色的、藍色的天空。  And all that I can see is just a yellow lemon tree.  但是我所看見的只有一株黃色的檸檬樹。
  • 免安裝版MySQL操作步驟
    1、 修改mysql安裝目錄下的my.ini文件a) 將Mysql的壓縮包先解壓,解壓後mysql安裝目錄下有如下的文件和文件夾:b) 打開my.ini文件(可以用記事本打開)c) 修改my.ini文件中basedir的值改為mysql的安裝目錄d) 修改my.ini文件中datadir的值改為mysql中data文件夾的目錄2、 配置環境變量