MySQL主要使用的幾種索引算法小結(jié)
在 MySQL 中,索引是一種提高查詢速度的數(shù)據(jù)結(jié)構(gòu)。不同的索引算法適用于不同的查詢場景,本文將詳細介紹 MySQL 的幾種主要索引算法。
1. B+Tree 索引(默認索引)
1.1 存儲結(jié)構(gòu)
B+Tree(B+ 樹)是一種平衡多路搜索樹,其特點是:
- 所有數(shù)據(jù)存儲在葉子節(jié)點,內(nèi)部節(jié)點僅存儲索引值。
- 葉子節(jié)點之間通過雙向鏈表相連,便于范圍查詢。
- 所有葉子節(jié)點在同一層,保持查詢效率穩(wěn)定。
1.2 適用存儲引擎
- InnoDB(默認)
- MyISAM
1.3 優(yōu)勢
? 適用于 范圍查詢(BETWEEN、>、< 等)? 適用于 ORDER BY 排序查詢? 葉子節(jié)點形成鏈表,支持 高效的順序遍歷
1.4 局限性
? 不適用于全文搜索(需要使用 Full-Text 索引)
? 插入/刪除頻繁時可能導(dǎo)致索引 分 裂
2. Hash 索引(適用于等值查詢)
2.1 存儲結(jié)構(gòu)
- 通過 哈希函數(shù) 計算鍵值映射到哈希桶,快速定位數(shù)據(jù)。
- 適用于 鍵值對查詢(key-value)。
2.2 適用存儲引擎
- Memory(Heap)引擎
- InnoDB(Adaptive Hash Index,自動優(yōu)化的哈希索引)
2.3 優(yōu)勢
? 適用于 等值查詢(=),查詢速度快(O(1) 時間復(fù)雜度)
? 哈希表查詢不會隨數(shù)據(jù)量增加而變慢
2.4 局限性
? 不支持范圍查詢(>、<、BETWEEN)? 不支持 ORDER BY 排序? 容易哈希沖突,影響查詢效率
3. Full-Text(全文索引)
3.1 存儲結(jié)構(gòu)
- 倒排索引(Inverted Index),存儲單詞 -> 文檔 ID 的映射。
- 適用于 全文搜索(如文章、評論、日志)。
3.2 適用存儲引擎
- InnoDB
- MyISAM
3.3 優(yōu)勢
? 適用于 全文搜索(MATCH() AGAINST())? 比 LIKE '%xx%'
查詢快得多
3.4 局限性
? 不適用于小數(shù)據(jù)量(索引維護開銷大)? 不能完全替代搜索引擎(如 Elasticsearch)
4. R-Tree(空間索引)
4.1 存儲結(jié)構(gòu)
- R-Tree(多維索引結(jié)構(gòu)),適用于存儲和查詢 地理坐標(點、矩形、多邊形)。
4.2 適用存儲引擎
- MyISAM
- InnoDB(MySQL 8.0 之后支持
SPATIAL
索引)
4.3 優(yōu)勢
? 適用于 地理信息查詢(如“某點附近的餐館”)? 適用于 空間范圍查詢(如“某個區(qū)域內(nèi)的所有數(shù)據(jù)”)
4.4 局限性
? 僅 MyISAM 支持,InnoDB 僅在 MySQL 8.0+ 支持
? 適用場景較窄,一般用于 GIS 應(yīng)用
5. Bitmap 索引(適用于低基數(shù)列)
5.1 存儲結(jié)構(gòu)
- 位圖(Bitmap),用 0/1 位 記錄某個值在不同數(shù)據(jù)行中的出現(xiàn)情況。
5.2 適用存儲引擎
- MySQL 不直接支持(Oracle、PostgreSQL 支持)
5.3 優(yōu)勢
? 適用于 低基數(shù)列(如性別、狀態(tài)、布爾值)? 節(jié)省存儲空間,查詢時可用位運算加速
5.4 局限性
? 不適用于高基數(shù)列(如手機號、用戶名)? 不支持動態(tài)更新(更新代價大)
6. 索引算法對比總結(jié)
索引類型 | 適用存儲引擎 | 適用查詢場景 | 優(yōu)勢 | 局限性 |
---|---|---|---|---|
B+Tree(默認) | InnoDB、MyISAM | 范圍查詢、排序查詢、主鍵/外鍵 | 適用于大多數(shù)場景 | 插入/刪除頻繁時可能導(dǎo)致索引分裂 |
Hash 索引 | Memory、InnoDB(自適應(yīng)) | 精確匹配(=) | 查詢速度快(O(1)) | 不支持范圍查詢、排序、模糊查詢 |
Full-Text 索引 | InnoDB、MyISAM | 全文搜索 | 適用于大文本字段(如文章搜索) | 不能完全替代搜索引擎 |
R-Tree(空間索引) | MyISAM、InnoDB(8.0+) | GIS 地理查詢 | 適用于空間數(shù)據(jù) | 僅適用于 MyISAM(8.0+ InnoDB 支持) |
Bitmap 索引 | MySQL 不支持 | 低基數(shù)列(如性別) | 高效存儲和查詢 | 更新代價高,不適用于高基數(shù)列 |
7. 結(jié)論
- 默認使用 B+Tree 索引(適用大部分情況)。
- 等值查詢用 Hash 索引,但 InnoDB 默認不支持(Adaptive Hash Index 除外)。
- 全文搜索用 Full-Text 索引,比
LIKE '%xx%'
查詢更快。 - GIS 查詢用 R-Tree 索引(
SPATIAL
索引)。 - 低基數(shù)字段(如性別)可以考慮 Bitmap 索引,但 MySQL 不支持。
選擇合適的索引結(jié)構(gòu),可以極大提升 MySQL 查詢性能!
到此這篇關(guān)于MySQL主要使用的幾種索引算法小結(jié)的文章就介紹到這了,更多相關(guān)MySQL 幾種索引算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 5.7.9 服務(wù)無法啟動-“NET HELPMSG 3534”的解決方法
這篇文章主要介紹了MySQL 5.7.9 服務(wù)無法啟動-“NET HELPMSG 3534”的解決方法,需要的朋友可以參考下2016-12-12Mysql創(chuàng)建視圖中文亂碼如何修改docker里的配置
這篇文章主要介紹了Mysql創(chuàng)建視圖中文亂碼如何修改docker里的配置,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-10-10MySQL中Distinct和Group By語句的基本使用教程
這篇文章主要介紹了MySQL中Distinct和Group By語句的基本使用教程,這里主要是針對查詢結(jié)果去重的用法,需要的朋友可以參考下2015-12-12