B+樹 & mysql

1、數據庫中最常見的慢查詢優化方式是什麼?

    加索引

2、爲什麼加索引能優化慢查詢?

    索引其實是一個數據結構,B+樹。

B+樹

B+樹 & mysql

一個m階的B+樹具有如下幾個特徵:

    1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
    2.所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
    3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

B+樹的優勢:

1.單一節點存儲更多的元素,使得查詢的IO次數更少。
2.所有查詢都要查找到葉子節點,查詢性能穩定。
3.3.所有葉子節點形成有序鏈表,便於範圍查詢。

3、你知道哪些數據結構可以提高查詢速度?

    哈希表、完全平衡二叉樹、B+樹。

4、那這些數據結構既然都能優化查詢速度,mysql爲何選擇用B+樹?

    一個節點裏面可以存多個元素:磁盤IO
    元素有冗餘+葉子節點之間有指針:範圍查找
    B+樹的優勢(見上面)

5、爲什麼一個節點爲1頁(16K)就夠了?

    假如有個高度爲2的B+樹:
    result = 葉子節點數 * 一個葉子節點裏能存放的數據條數
    葉子節點數 = 根節點的指針數 = {索引值+ 指針}組合數 = 索引值個數
    假設一行數據的大小-=1KB(合理的值)
    一個葉子節點能夠存放的數據條數?16KB / 1KB = 16條
    索引值個數?16KB / {int類型索引值8B + 指針6B}  (14B) = 16KB / 14B = 1170
    result = 1170*16=18720
    B+樹高度爲2 : 1170*16=18720
    B+樹高度爲3:  1170 * 1170 * 16 = 21902400

6、mysql兩種存儲引擎下的B+樹使用
InnoDB中的B+樹:
InnoDB種主鍵索引的葉子節點的數據區域存儲的是數據記錄,輔助索引存儲的是主鍵值:
B+樹 & mysql
輔助索引:

B+樹 & mysql

MyISAM中的B+樹:

    MYISAM中葉子節點的數據區域存儲的是數據記錄的地址。

7、B+樹 VS B樹:

B+樹的非葉子節點不存儲數據,只有葉子節點才存儲數據;
而B樹的非葉子節點和葉子節點都會存儲數據,會導致非葉子節點存儲的索引值
會更少,樹的高度相對會比B+樹高,平均的I/O效率會比較低,所以使用B+樹作
爲索引的數據結構。
再加上B+樹的葉子節點之間會有指針相連,也方便進行範圍查找。

8、InnoDB總結:

InnoDB中的主鍵索引和實際數據是綁定在一起的,也就是說InnoDB的一個表一
定要有索引,如果一個表沒有手動建立主鍵索引,InnnoDB會查看有內有唯一索
引,如果有則選用唯一索引作爲主鍵索引,如果連唯一索引也沒有,則會默認建
立一個隱藏的主鍵索引(用戶不可見)。
 另外,InnoDB的主鍵索引要比MyISAM的主鍵索引查詢效率要高(少一次磁盤IO),並且比輔助索引也要高很多。
 所以,我們在使用InnoDB作爲存儲引擎時,我們最好:

 1、手動創建主鍵索引
 2、儘量利用主鍵索引查詢

9、到底什麼是索引?

    大學老師定義:索引就像是輸的目錄。
    mysql官網定義:indexes  are used to find rows with specific column values quickly.
    簡單理解:索引是一種優化查詢的數據結構。

10、 MySQL總結:

    B+樹可以更好的結合磁盤IO原理,提高查詢效率。
    Innodb一定要有主鍵,沒有主鍵以唯一索引爲主鍵,否則會建立一個隱藏主鍵
    Innodb的數據是和主鍵索引存在一起的(數據在葉子節點中,MyISAM的葉子
    結點數據區域存儲的是數據地址)
    建立索引時要考慮已有索引,一個sql語句只會選擇花費最低的一個索引執行
    索引是一種有序的數據結構(B+樹),一個節點可以存多個有序的元素,所
    以要利用好最左前綴原則。

11、MySQL索引的本質

     索引是一種有序的數據結構

12、mysql索引的底層原理

    B+樹實現,具體見上面描述。

    PS:一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以
     索引文件的形式存儲的磁盤上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章