mysql B tree索引與hash索引

2021-08-19 02:16:30 字數 1925 閱讀 7859

一.mysql支援的索引型別

mysql的索引是在儲存引擎層實現的,即使同一種索引在不同的儲存引擎上也可能底層實現不同。

1.1 b-tree索引是我們最常見的索引。

(1)特點:

使用b+樹結構儲存資料。b+樹結構特點:每乙個節點都儲存下乙個節點的指標。這樣可以方便葉子節點的遍歷。每乙個葉子節點到根節點的距離是相同的。並且所有葉子節點都是根據鍵值大小按順序存放,並且節點直接通過指標來鏈結。b-tree在不同的儲存引擎下實現是不同的,myiasm是在葉子節點上是通過資料的物理位置來進行引用行的,innodb是通過主鍵來引用b-tree索引的行。

我們可以發現b-tree的大小遠遠小於儲存資料的大小,這樣儲存引擎就不需要全表掃瞄來獲取資料,取而代之是從索引的根節點進行搜尋。索引的根節點中存放了下層節點的指標,通過比較節點的值和要查詢的值,可以得到合適的指標進入下一層節點。這些指標定義了值的上限與下限,儲存引擎要找到對應的值可以確定索引所要查詢的值是否存在,最終儲存引擎通過b-tree索引找到符合要求的節點。葉子節點比較特別,指標指向被索引的資料而非其他的節點。

b-tree索引更適合範圍查詢。b-tree索引同一層節點根據鍵值大小按順序存放。

(2)在什麼情況下使用b-tree索引

全值匹配:和索引中的所有列來進行全值匹配。

匹配最左字首的查詢:聯合索引只要第一列符合查詢條件就會被用到。

匹配列字首的查詢:匹配某一列資料的字首。

匹配範圍查詢:

精確匹配左前列並範圍匹配另一列。

只訪問索引的查詢:覆蓋索引。只訪問索引而不查詢資料行,這種查詢資料非常高。

同時b-tree也支援排序。因為其儲存按照鍵順序存放。

(3)btree索引的使用限制

所用索引所命中了表中大部分的資料時,mysql查詢優化器認為全表掃瞄可能會效能個更好。

若不是按照索引列最左列開始查詢,則無法使用索引。

使用索引時不能跳過索引中的列。

not in 和 <>操作無法使用索引。

如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引。

2.hash索引定義:

innodb根據b-tree索引的所用情況自己建立的,自適應hash索引。

(1)hash索引是基於hash表實現的,只有查詢條件精確匹配,hash索引中的所有列時才能使用hash索引。模糊查詢,範圍查詢不支援。

(2)對於hash索引中的所有列,儲存引擎都會為每一行計算乙個hash碼,hash索引中儲存的就是hash碼。它的儲存很緊湊,查詢速度快。

2.hash索引限制

(1)hash索引必須進行兩次查詢,hash索引儲存:鍵值,hash碼,行指標。

使用hash必須先找到行指標,然後再去行讀取。

(2)hash索引無法排序hash索引按照hash儲存而非鍵值儲存,所以不能像btree索引那樣查詢結果進行排序。

(3)hash索引不支援範圍查詢,部分索引查詢

(4)hash衝突。不同行可以計算出相同的hash值。hash碼通常都比較小。為了提高效率。一旦產生大量的hash衝突,就會影響hash的查詢。索引hash索引不適合儲存在重複性多的列。

3.為啥要使用索引?

使用索引可以快速定位要訪問的資料,大大減少了儲存引擎需要掃瞄的數量。

btree索引是按照順序儲存,所以我們可以進行排序。避免使用磁碟臨時表來進行排序。減少io消耗。

索引查詢可以把隨機io改為順序io。資料行的儲存通常都是隨機分布的。更加充分發揮磁碟io效能。

只有索引帶來的好處大於其壞處,那麼才是有效的。

索引會增加操作的成本。增刪改操作都需要維護索引。

過多索引也會增加查詢優化器的選擇時間。mysql查詢優化器會根據索引的統計資訊和查詢條件為查詢選擇合適的索引。若可選擇的索引越多,mysql查詢統計資訊生成執行計畫的時間。

Mysql BTREE 索引與HASH 索引

btree 索引與hash 索引,兩種不同型別的索引各有其不同的適用範圍。hash 索引有一些重要的特徵需要在使用的時候特別注意,如下所示 1.只用於使用 或 操作符的等式比較。2.優化器不能使用hash 索引來加速order by 操作。3.其mysql 不能確定在兩個值之間大約有多少行。如果將乙...

Mysql B tree索引和雜湊索引

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大...

MySQL BTree索引和hash索引的區別

備註 先說下,在 mysql 文件裡,實際上是把b 樹索引寫成了btree,例如像下面這樣的寫法 sql view plain copy create table t aid int unsigned notnull auto increment,userid int unsigned notnul...