- MySQL索引B+樹、全文索引、哈希索引
注意:B+樹中B不是代表二叉樹(binary),而是代表平衡(balance),因為B+樹是從最早的平衡二叉樹演化而來,但是B+樹不是一個二叉樹。
B+樹的高度一般在2~4層,因此每次查詢最多只需要2~4次IO。
1.?B+樹索引(BTREE)
特點:
B+樹是一種自平衡的多路搜索樹,它是一種高度平衡的結構,保證從根節點到任意葉子節點的路徑長度幾乎相等,從而保證了查詢效率相對穩定。
B+樹索引的所有數據都存儲在葉子節點,并且葉子節點之間通過雙向鏈表連接,形成了一個有序的數據集合。
支持范圍查詢、排序和分組操作,因為葉子節點是有序排列的。
可以是單列索引或多列索引(復合索引),并遵循最左前綴匹配原則,即在查詢時,如果查詢條件包含了復合索引的最左邊部分列,就能利用索引進行高效查詢。
適用于大部分查詢場景,特別是等值查詢、范圍查詢以及基于索引列的排序和分組。
優點:
查詢效率較高,尤其是對于范圍查詢和有序結果集的獲取。
能夠處理大量數據,因為B+樹的高度較低,即使數據量很大,查詢深度也不會過高。
缺點:
對于非常小的數據集,建立和維護B+樹索引可能比直接全表掃描更耗時。
對于等值查詢,如果鍵值分布不均勻導致哈希沖突較少,哈希索引可能更快。
2.?全文索引
特點:
全文索引主要用于對文本類型的字段(如VARCHAR、TEXT)進行全文本搜索,能夠處理復雜的查詢條件,如包含某個詞語或短語、近似匹配、詞干提取等。
MySQL的全文索引通常基于倒排索引實現,即為每個單詞建立一個索引項,記錄下包含該單詞的所有文檔(在數據庫中對應為記錄)的列表及位置信息。
通常用于大型文本數據的全文檢索,如博客文章、產品描述、文獻資料等。
優點:
非常適合進行復雜文本內容的模糊查詢和關鍵詞搜索。
提供了對文本數據的高效過濾能力,顯著減少針對文本字段進行LIKE '%keyword%'這類操作時的全表掃描。
缺點:
創建和維護全文索引需要消耗額外的空間和時間資源。
索引更新時有延遲,對于實時性要求較高的場景可能不合適(可通過手動刷新解決)。
對查詢語法有一定要求,需要使用MATCH AGAINST語句,而非普通的WHERE子句。
對于短詞、停用詞(如“的”、“是”等常見詞匯)的處理可能不夠精確,可能需要配合語言分析器和定制化配置。
3.?哈希索引(HASH)
特點:
哈希索引基于哈希表實現,通過哈希函數將鍵值轉換為固定長度的哈希值,然后通過哈希值直接定位到對應的記錄。
主要適用于等值查詢,查詢效率極高,只需一次哈希計算即可找到相應記錄(假設沒有哈希沖突)。
不支持范圍查詢、排序和分組操作,因為哈希索引并不保持鍵值的有序性。
對于鍵值唯一性高的列(如唯一標識符),哈希索引效果尤為出色。
通常用于內存型存儲引擎(如MEMORY引擎)或者InnoDB引擎的自適應哈希索引(Adaptive Hash Index,AHI)。
優點:
等值查詢性能極高,尤其在鍵值分布均勻且唯一性強的情況下。
查找時間復雜度接近O(1),在理想情況下能提供極快的查詢速度。
缺點:
只適用于等值查詢,無法處理范圍查詢、排序和分組。
如果鍵值分布不均導致哈希沖突較多,性能會下降,尤其是在存在大量重復鍵值的情況下。
不支持部分索引列的匹配(如復合索引的部分列查詢)。
哈希索引不存儲原始鍵值,只存儲哈希值和行指針,因此不能避免對數據行的訪問來獲取完整數據。
?如果大家需要視頻版本的講解,歡迎關注我的B站: