三、儲存引擎
四、效能優化優化
待續.......
一、索引是幫助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資料,每頁會與每頁之間通過指標進行連線...