MySQL資料庫索引原理總結

2021-09-20 10:28:47 字數 2271 閱讀 6518

mysql資料庫中索引

在mysql索引使用中,常常出現索引效能需要考慮的問題,那我們是否應當對索引原理進行深入思考。

mysql中不同的儲存引擎使用的索引原理是不同的,下面介紹三種型別的索引型別b-tree、b+tree、hash。

什麼是btree

btree是一種高效的資料庫儲存結構,具體結構形式如下圖:

什麼是平衡二叉樹

我們在高效搜尋的過程中,二叉搜尋會提高我們搜尋的效率,而平衡二叉樹正是二分搜尋的一種結構實現方式,這種樹狀結構大大減少無關資料的搜尋,提高了搜尋效能,使二分法搜尋得到完美實現。

平衡二叉樹結構組成條件為:非葉子節點只能允許最多兩個子節點存在,每乙個非葉子節點資料分布規則為左邊的子節點小當前節點的值,右邊的子節點大於當前節點的值(這裡值是基於自己的演算法規則而定的,比如hash值);如下圖

紅黑樹

我們在構建平衡二叉樹時,會出現數值呈線性區分,導致破壞樹狀結構入下圖

這時我們就要使用演算法對平衡二叉樹進行重新規定,常見的演算法有:alk、伸展樹、紅黑樹等等,這裡我們著重介紹紅黑樹,

紅黑樹是一種特殊的平衡二叉樹,它是將二叉樹的所有根與節點分為紅色與黑色兩種類別再進行規範,下面介紹它的性質:

1.不能出現兩個連續的紅色節點

2.根節點必須為黑色

3.每個到子節點的路徑上黑節點的數目都相同

4.節點必須為紅色或者黑色

mysql中myisam和innodb的索引實現原理

myisam和innodb兩種儲存引擎都是使用b+tree來進行索引的實現,但是二者卻有很大區別

1.myisam索引的實現是使用b+tree樹進行查詢的,但是myisam索引的實現運用非聚集索引的形式進行搜尋的,它在data域中儲存的為我們資料的位址值,通過主索引或者輔助索引找到相對應的位址值,然後通過位址值再找到對應的資料並拿出,具體流程如下圖:

在圖中col1為主索引,而col2為輔助索引,在b+tree結構中 輔助索引可以重複但是主索引不可重,我們稱這種資料的搜尋方式為非聚集索引,下面我們會對聚集性索引進行介紹

2.innodb在mysql中也是一種常用的儲存引擎,innodb與myisam相同同樣是使用b+tree資料庫結構,但是與之不同的是innodb在進行操作時,在innodb的b+tree結構中葉節點除了儲存主索引與輔助索引以外還直接在data域中儲存著相關資料,而不是通過位址值來進行獲取,這種方式的索引我們常常稱為聚集性索引,如下圖:

mysql中hash索引形式

當然在mysql中,也有一些儲存引擎使用的是hash儲存形式,hash儲存形式有著比b+tree更加高效的索引效果,但是hash儲存不能進行範圍查詢,只能進行 in 「=」 操作,對資料的查詢具有侷限性。

在hash後,資料不能能與之前未進行hash的資料進行互動導致侷限性,這是無法避免的/

mysql的索引選擇與思考

這時我們應當思考,同樣擁有高效能的紅黑樹,mysql為什麼還要選擇b+tree這種結構,在深度方面紅黑樹比b+tree有著更好的控制,我們從mysql的主存儲存原理與磁碟儲存原理中去**就會發現,b+tree在建立每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。

這樣就使磁頭對磁軌的操作大大減少,說明b+tree這種結構在物理級實現還是非常高效的,在去磁頭去做每次i/o的過程中,漸進複雜度大大減少,相比之下,紅黑樹的結構,操作次數並沒有這麼簡單,還是逐級讀取,所以這體現了b+tree的優勢,也是最終mysql選擇b+tree的原因。

Mysql資料庫索引原理 InnoDB索引實現

innodb使用b tree作為索引結構 例如有這麼乙個表資料 col1為主鍵 在innodb中,表資料檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉結點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。圖1圖1是innodb資料檔案...

MySQL資料庫索引底層原理

綜述 mysql索引底層採用的是b樹和b 樹來實現。那為什麼是b樹和b 樹而不是其他諸如陣列 鍊錶 平衡二叉樹這些資料結構呢?下面來學習。1 資料庫檔案儲存方式 資料庫檔案都是以磁碟檔案儲存在系統中的,這也是資料庫能夠持久化儲存資料的原因。2 從資料庫讀取資料的原理 從資料庫中讀取資料,先不考慮從快...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...