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

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

技術乾貨,第一時間推送

作者:浪人~來源: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的主索引。

-解讀源碼-

知其然並知其所以然

相關焦點

  • 什麼B+樹索引,為什麼MySQL使用B+樹索引,而MongoDB缺還是使用B樹索引
    什麼是B+樹索引,很多人在面試的時候總時被問到,也有很多人是說不清楚的。
  • 【面試索引】B-Tree、B+Tree、紅黑樹、B*Tree數據結構
    面試官:你知道文件索引、資料庫索引一般用什麼數據結構來存儲嗎?小秋:知道啊,一般都是用樹形結構來存儲的。
  • 程式設計師應該如何構建高性能Mysql索引
    索引類型1、B-tree索引Myisam和innodb中,默認用B-tree索引,是一種平衡樹。可以抽象一下---B-tree系統,可理解為"排好序的快速查找結構」2、hash索引在memory表裡,默認是hash索引, hash的理論查詢時間複雜度為O(1)既然hash的查找如此高效,為什麼不都用hash索引?
  • 谷歌發布基於B-Tree的C++模板庫
    谷歌開源團隊近日發布了C++ B-Tree,這是一個C++模板庫,實現了基於B-tree數據結構的有序內存容器。類似於STL的map、set、multimap和multiset模板,C++ B-tree也提供了btree_map、btree_set、btree_multimap和btree_multiset等模板。
  • 算法-B樹和B+樹總結
    B+ tree is an N-ary tree with a variable but often large number of children per node.B樹和B+樹的區別綜述 磁碟存儲和mysql的索引這一塊用的比較多,以空間換時間來提升查找速度。
  • 深入理解:LSM-tree 索引
    但是他有兩個缺點:hash 索引需要放在內存中,當數據量大了後,這種不可取的。hash 索引不能有效的範圍查找,比如我需要查詢[key0-key99]之間的數據,我們需要分別取。下面我們將一步一步分析LSM tree是如何做到高性能寫入,並且能夠也能快速讀取數據的。下圖是整個LSM tree 的架構
  • 圖解MySQL索引:如何正確使用索引?
    MySQL中有個很重要的規則,即最左匹配原則用來定義組合索引的命中規則,它是指在檢索數據時從聯合索引的最左邊開始匹配。假設對用戶表建立一個聯合索引(a,b,c),那麼條件a,(a,b),(a,b,c)都會用到索引。
  • MySQL大廠面試:10分鐘掌握MySQL索引面試方方面面(建議收藏)
    答:索引,是存儲引擎用於快速找到記錄的一種數據結構,類似新華字典的目錄。MyIsAm是採用的非聚集索引,而InnoDB採用的是聚集索引。比如字典中有拼音查找法,有筆畫查找法,不同的檢索方式也就等於MySQL中不同的數據檢索結構,相對的MySQL中常用的有B、B+tree還有hash。
  • 24個經典MySQL索引問題,面試學習必看
    所以按主鍵查詢,速度最快B+tree性質:1)n棵子tree的節點包含n個關鍵字,不用來保存數據而是保存數據的索引。2)所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序連結。
  • MySQL中的索引原理與索引分類
    R-tree索引(空間索引):空間索引是MyISAM引擎的一個特殊索引類型,主要用於地理空間數據類型,通常使用較少;Full-text(全文索引):全文索引也是MyISAM的一個特殊索引類型,主要用於全文索引,InnoDB從MySQL 5.6版本開始支持全文索引;MyISAM、InnoDB、Memory三種存儲引擎對各種索引類型的支持:索引InnoDB引擎MyISAM引擎Memory引擎
  • 二叉樹、平衡二叉樹、B-Tree、B+Tree 說明
    ,都清楚其索引主要以B+樹為主,此外還有Hash、RTree、FullText。B樹(B-Tree)概念:B樹和平衡二叉樹不同,B樹屬於多叉樹又名平衡多路查找樹(查找路徑不只兩個),資料庫索引裡大量使用者B-Tree和B+Tree的數據結構。
  • MySQL索引原理-B樹和B+樹的區別
    首先強烈推薦一個數據結構可視化工具(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html)       最近在學習資料庫索引調優相關知識
  • 如何查看 sql 查詢是否用到索引 ( mysql )
    `credit_creditchannel`    ) b    ON a.custid = b.custid;查看索引狀態:credit_apply表mysql> show index from sync.
  • 樹 Story —— B 樹 / B+ 樹
    用過 MySQL 的朋友一定對 B+ 樹不陌生,MySQL 的索引結構就是 B+ 樹。B+ 樹的概念是在 B 樹之上,而 B 樹是什麼呢?在計算機科學中,B樹(英語:B-tree)是一種自平衡的樹,能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作,都在對數時間內完成。
  • Mysql索引:表在哪些情況下需要加索引,應該加哪種索引,你懂嗎
    在前面兩篇文章中我們了解到了mysql索引的重要性,那麼我們的數據表到底在哪種情況下才適合添加索引呢?索引有好多種我們應該添加哪種呢?今天我們就來一起聊聊這個問題。千學不如一看,千看不如一練首先我們先創建一張test_table數據表創建一個存儲過程插入256萬測試數據執行5次:insert into test_table (a,b,c,d) select a,b,c,d from test_table
  • Mysql索引:圖文並茂,深入探究索引的原理和使用
    如果查詢條件是單獨使用b,因為無法確定a的值,因此無法使用索引。假如在table表的a,b,c三個列上建立聯合索引,簡要分類分析下聯合索引的最左前綴匹配。,可以用到聯合索引SELECT * FROM table WHERE a=1SELECT * FROM table WHERE a=1 AND b=33、未從最左列開始時,無法用到聯合索引SELECT * FROM table WHERE b=1 AND b=34、查詢列不連續時,無法使用聯合索引(會用到a列索引,但c排序依賴於
  • MySQL教程索引優化的詳解
    MySQL支持的索引類型B-tree索引的特點1、B-tree索引以B+樹的結構存儲數據2、B-tree索引能夠加快數據的查詢速度>3、B-tree索引更適合進行行範圍查找B-tree結構圖在什麼情況下可以用到B樹索引?
  • 你說你熟悉MySQL索引,給我講講創建索引時應該注意什麼?
    最左前綴可以是聯合索引的最左 N 個欄位,也可以是字符串索引的最左 M 個字符。索引列的順序在建立聯合索引的時候,如何安排索引內的欄位順序。有兩個原則。比如,有 a和 b兩列,現在需要建立 a的索引和 a、b兩列的聯合索引,不需要 b列的索引,那建立 (a,b)聯合查詢就會比 (b,a)好,因為前者建立之後就不再需要單獨建立 a的索引。
  • in the tree與on the tree深入辨析
    今天的詞彙辨析很有趣,你知道in the tree和on the tree的區別嗎,在中文中,我們都翻譯為「在樹上」,比如:一隻鳥在樹上,一個蘋果在樹上,一個小孩坐在樹上……但是在英語中對這些用法是有所區分的。
  • 面試命中率90%的點——MySQL索引
    通常我們說的索引不出意外指的就是(B樹)索引(實際是用B+樹實現的,因為在查看表索引時,MySQL一律列印BTree,所以簡稱為B樹索引)主鍵索引區:PI(關聯保存的數據的地址)按主鍵查詢,普通索引區:SI(關聯的ID的地址,然後再到達上面的地址)。所以按主鍵查詢,速度最快1)n棵子tree的節點包含n個關鍵字,不用來保存數據而是保存數據的索引。