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