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

2021-10-04 11:01:08 字數 1556 閱讀 6137

三、儲存引擎

四、效能優化優化

待續.......

一、索引是幫助mysql高效獲取資料的排好序的資料結構

二、索引的資料結構

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引擎)

非聚集索引:

四、效能優化優化

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

1、innodb表檔案本身就是按b+tree組織的乙個索引結構檔案,所謂要有主鍵。如果表沒有設計主鍵那麼mysql表中找一列,如果沒找到會在後台預設加乙個看不見的主鍵。

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

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...

MySQL索引底層原理

通過hash演算法,能快速檢索資料 資料碰撞問題用鏈位址法 無法進行範圍搜尋 解決雜湊索引無法範圍搜尋的問題 極端情況下會退化成線性鍊錶,自增主鍵必然會導致極端情況 會自動調整樹形態,使其保持平衡,調整會消耗效能 無法完全解決二叉查詢樹的問題 絕對平衡的二叉樹,更耗效能 根本解決了紅黑數的問題 由於...

mysql索引底層原理

索引的本質 資料結構 組織資料的方式 innodb沒有主鍵索引時,判斷是否含有唯一索引,沒有唯一就生成乙個隱藏的row id作為主鍵 在資料較少時是以鍊錶的形式儲存資料的,當資料過多,長鍊表會影響資料的查詢,此時會將資料通過頁的形式進行儲存,預設一頁儲存16kb資料,每頁會與每頁之間通過指標進行連線...