Mysql索引底層原理與性能優化


在一般的開發中不會有碰到數據結構、算法的一些底層東西。但是瞭解了之後會對你的開發有很大的幫助。最近學習了一下。做一個筆記。更深的學習,請看相關書籍或視頻。

一、索引是幫助Mysql高效獲取數據的排好序的數據結構

二、索引的數據結構

  • 二叉樹
  • 紅黑樹
  • Hash表
  • B-Tree
  • B+Tree
1、二叉樹

如圖(一個二叉樹插入的過程):在這裏插入圖片描述

有一個根節點,有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。左側的節點永遠比右側的要小。

如圖(查找數據)在這裏插入圖片描述

查找數據,如果按插入順序查詢要7步(因爲是最後一個插入的),二叉樹了3步查出結果。比順序結構快了很多。但是有一個問題,如果是數據是順序遞增。那就會變爲鏈表,那索引就無效了。那麼就出現了紅黑樹

如圖:在這裏插入圖片描述

2、紅黑樹

如圖:(紅黑樹的插入過程)在這裏插入圖片描述

所以,紅黑樹又是二叉樹的升級版,是特化平衡二叉樹。但是在數據量大的時候樹的高度就會增加,然後會導致IO過程多,查詢速度會減慢些。

3、Hash表

是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

簡單說就是有一個表存着一個值得算出來的hash值,和對應的數據地址,查詢很快。但是有個缺點,如果查詢大於小於的數據時候就不行了。所以有一定的侷限。

4、B-Tree

B樹和平衡二叉樹稍有不同的是B樹屬於多叉樹又名平衡多路查找樹。簡單點說就是一個節點可以有多個分叉。這樣可以減少樹的高度從而減少IO磁盤。

如圖(B-Tree插入過程):

在這裏插入圖片描述

上面說了這麼多其實都是在鋪墊。Mysql索引底層用的是B+Tree和Hash表(可以選擇)。B+Tree又是啥。B+Tree是B-Tree的優化版。其實上面的說的數據和索引都是在一個節點存儲。B+Tree,是把數據都放到了葉子節點,上面都是索引,這樣就可以減少節點的存儲空間,而來增加的每個節點的索引數量。葉子節點就是它的所有存儲數據。

5、B+Tree

如圖(B+插入過程):在這裏插入圖片描述

三、存儲引擎

聚集索引:

聚集索引-葉節點包含了完整的數據記錄。就是說索引和數據是在一個文件存儲(如:InnoDB引擎)

非聚集索引:

非聚集索引就是索引和數據不在一個文件存儲。索引有索引的文件對應的數據的地址。數據是數據的文件。(如:MyISAM引擎)

四、性能優化優化

爲什麼InnoDB表必須有主鍵,並且推薦使用整形的自增主鍵?

1、InnoDB表文件本身就是按B+Tree組織的一個索引結構文件,所謂要有主鍵。如果表沒有設計主鍵那麼Mysql表中找一列,如果沒找到會在後臺默認加一個看不見的主鍵。

2、整形的比較會更快,自增會避免在插入數據時在數據的中間插入破壞結構。

待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章