在 mysql 中,索引是一种提高查询速度的数据结构。不同的索引算法适用于不同的查询场景,本文将详细介绍 mysql 的几种主要索引算法。
1. b+tree 索引(默认索引)
1.1 存储结构
b+tree(b+ 树)是一种平衡多路搜索树,其特点是:
- 所有数据存储在叶子节点,内部节点仅存储索引值。
- 叶子节点之间通过双向链表相连,便于范围查询。
- 所有叶子节点在同一层,保持查询效率稳定。
1.2 适用存储引擎
- innodb(默认)
- myisam
1.3 优势
✅ 适用于 范围查询(between、>、< 等)✅ 适用于 order by 排序查询✅ 叶子节点形成链表,支持 高效的顺序遍历
1.4 局限性
❌ 不适用于全文搜索(需要使用 full-text 索引)
❌ 插入/删除频繁时可能导致索引 分 裂
2. hash 索引(适用于等值查询)
2.1 存储结构
- 通过 哈希函数 计算键值映射到哈希桶,快速定位数据。
- 适用于 键值对查询(key-value)。
2.2 适用存储引擎
- memory(heap)引擎
- innodb(adaptive hash index,自动优化的哈希索引)
2.3 优势
✅ 适用于 等值查询(=),查询速度快(o(1) 时间复杂度)
✅ 哈希表查询不会随数据量增加而变慢
2.4 局限性
❌ 不支持范围查询(>、<、between)❌ 不支持 order by 排序❌ 容易哈希冲突,影响查询效率
3. full-text(全文索引)
3.1 存储结构
- 倒排索引(inverted index),存储单词 -> 文档 id 的映射。
- 适用于 全文搜索(如文章、评论、日志)。
3.2 适用存储引擎
- innodb
- myisam
3.3 优势
✅ 适用于 全文搜索(match() against())✅ 比 like '%xx%'
查询快得多
3.4 局限性
❌ 不适用于小数据量(索引维护开销大)❌ 不能完全替代搜索引擎(如 elasticsearch)
4. r-tree(空间索引)
4.1 存储结构
- r-tree(多维索引结构),适用于存储和查询 地理坐标(点、矩形、多边形)。
4.2 适用存储引擎
- myisam
- innodb(mysql 8.0 之后支持
spatial
索引)
4.3 优势
✅ 适用于 地理信息查询(如“某点附近的餐馆”)✅ 适用于 空间范围查询(如“某个区域内的所有数据”)
4.4 局限性
❌ 仅 myisam 支持,innodb 仅在 mysql 8.0+ 支持
❌ 适用场景较窄,一般用于 gis 应用
5. bitmap 索引(适用于低基数列)
5.1 存储结构
- 位图(bitmap),用 0/1 位 记录某个值在不同数据行中的出现情况。
5.2 适用存储引擎
- mysql 不直接支持(oracle、postgresql 支持)
5.3 优势
✅ 适用于 低基数列(如性别、状态、布尔值)✅ 节省存储空间,查询时可用位运算加速
5.4 局限性
❌ 不适用于高基数列(如手机号、用户名)❌ 不支持动态更新(更新代价大)
6. 索引算法对比总结
索引类型 | 适用存储引擎 | 适用查询场景 | 优势 | 局限性 |
---|---|---|---|---|
b+tree(默认) | innodb、myisam | 范围查询、排序查询、主键/外键 | 适用于大多数场景 | 插入/删除频繁时可能导致索引分裂 |
hash 索引 | memory、innodb(自适应) | 精确匹配(=) | 查询速度快(o(1)) | 不支持范围查询、排序、模糊查询 |
full-text 索引 | innodb、myisam | 全文搜索 | 适用于大文本字段(如文章搜索) | 不能完全替代搜索引擎 |
r-tree(空间索引) | myisam、innodb(8.0+) | gis 地理查询 | 适用于空间数据 | 仅适用于 myisam(8.0+ innodb 支持) |
bitmap 索引 | mysql 不支持 | 低基数列(如性别) | 高效存储和查询 | 更新代价高,不适用于高基数列 |
7. 结论
- 默认使用 b+tree 索引(适用大部分情况)。
- 等值查询用 hash 索引,但 innodb 默认不支持(adaptive hash index 除外)。
- 全文搜索用 full-text 索引,比
like '%xx%'
查询更快。 - gis 查询用 r-tree 索引(
spatial
索引)。 - 低基数字段(如性别)可以考虑 bitmap 索引,但 mysql 不支持。
选择合适的索引结构,可以极大提升 mysql 查询性能!
到此这篇关于mysql主要使用的几种索引算法小结的文章就介绍到这了,更多相关mysql 几种索引算法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论