我們都理解B+樹和Hash索引的區別有助於我們預測索引在不同的存儲引擎中是怎麼執行查詢的。 B+ TREE 索引特性B數是一種在資料庫索引中流行的樹數據結構。該結構始終保持排序,從而可以快速查找精確匹配。MySQL中使用的是B樹的一種變體,B+樹,這種類型的索引可用於大多數存儲引擎,例如InnoDB ...
我們都理解B+樹和Hash索引的區別有助於我們預測索引在不同的存儲引擎中是怎麼執行查詢的。
B+ TREE 索引特性
B數是一種在資料庫索引中流行的樹數據結構。該結構始終保持排序,從而可以快速查找精確匹配。MySQL中使用的是B樹的一種變體,B+樹,這種類型的索引可用於大多數存儲引擎,例如InnoDB和 MyISAM。B+樹中的B不是代表二叉(binary),而是代表平衡(balance),因為 B+樹是從最早的平衡二叉樹演化而來,但是B+樹不是一個二叉樹。
B+樹可以用在=、 >、 >=、 <、 <= 、BETWEEN 等比較運算符中進行比較。也可以用在不是以通配符%開頭的LIKE語句中進行比較,因為LIKE語句如果以通配符開頭,索引可能會失效。
比如下麵的SQL語句就沒有使用索引即使key_col建立了索引。
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
1.
如果使用LIKE ‘%string_like%’ 進行查詢時string_like字元串超過三個字元,MySQL將使用Turbo Boyer-Moore演算法對string_like字元串進行初始化以達到快速查詢的目的。
Boyer-Moore演算法在用於查找子字元串的演算法當中,BM(Boyer-Moore)演算法被認為最高效的字元串搜索演算法,它由Bob Boyer和J Strother Moore設計於1977年。一般情況下,比KMP演算法快3-5倍。該演算法常用於文本編輯器中的搜索匹配功能,比如大家所熟知的GNU grep命令使用的就是該演算法,這也是GNU grep比BSD grep快的一個重要原因。 — 百度百科
有時候即使查詢能命中索引,MySQL也不會使用索引。當MySQL優化器發現通過索引需要掃描的行占比很大,在這種情況下,表掃描可能會快得多,因為它需要查找的行更少。
Hash 索引特性
Hash 索引是通過hash演算法進行索引的建立和查詢的,hash演算法是把任意長度的輸入通過hash演算法變換成固定長度的輸出,該輸出就是hashcode,hash演算法本質上來說是壓縮演算法。當數據量大很可能進行大量hash衝突,影響性能。所以hash所以更適合精確查詢。
兩者區別
B+樹索引支持精確查詢、比較查詢、範圍查詢、模糊查詢、排序等多種查詢方式。如下:
-
進口氣動球閥
而Hash 索引更適合精確查詢,也不能進行 ORDER BY排序操作,比較查詢、範圍查詢、模糊查詢更不好處理了。
總結
B+樹索引支持的查詢方式更多,更適合作為資料庫索引的數據結構。但是如果系統需要Hash 索引這種key-value查詢的方式也可以選擇Hash 索引。