MySQL 的 BTree 索引和 Hash 索引的区别
一、定义
类型 |
定义说明 |
时间复杂度 |
BTree 索引 |
使用 B+ 树结构组织索引数据,适用于范围查询、有序遍历等 |
O(log n) |
Hash 索引 |
使用哈希表结构组织索引,仅适用于等值查找操作 |
O(1) |
二、使用引擎
存储引擎 |
索引类型 |
InnoDB |
默认使用 BTree 索引 |
Memory |
默认使用 Hash 索引,可手动改为 BTree |
三、核心区别
对比维度 |
BTree 索引 |
Hash 索引 |
数据结构 |
B+ 树结构 |
哈希表结构 |
是否有序 |
✅ 有序,可用于范围查询 |
❌ 无序,不能做范围查询 |
支持操作 |
等值查询、范围查询、模糊匹配、排序等 |
仅等值查询(=) |
查询效率 |
O(log n) |
O(1),理论最优情况 |
更新代价 |
相对稳定 |
更新频繁时可能导致哈希冲突 |
冲突处理 |
无冲突(树结构路径固定) |
有冲突(哈希值相同可能冲突) |
联合索引支持 |
✅ 支持最左前缀匹配 |
❌ 不支持 |
四、使用示例
SELECT * FROM user WHERE name = 'Tom';
- Hash 索引:查询非常快,但不能进行范围、模糊查询。
- BTree 索引:支持以下查询:
SELECT * FROM user WHERE name LIKE 'T%';
SELECT * FROM user WHERE age BETWEEN 18 AND 30;
SELECT * FROM user ORDER BY age;
五、使用建议
使用场景 |
推荐索引类型 |
仅做等值查询 |
Hash |
需要排序、范围查询、模糊匹配 |
BTree |
表使用 InnoDB(支持事务) |
BTree(默认) |
表使用 Memory,且查找模式为等值查询 |
Hash(默认) |
六、总结对比
维度 |
BTree 索引 |
Hash 索引 |
是否有序 |
✅ 是 |
❌ 否 |
支持范围查询 |
✅ 是 |
❌ 否 |
支持模糊匹配(LIKE) |
✅ 是 |
❌ 否 |
支持排序 |
✅ 是 |
❌ 否 |
查询性能 |
稳定 O(log n) |
理想情况下 O(1) |
存储引擎默认支持 |
InnoDB、MyISAM |
Memory(默认) |
选择合适的索引类型能够显著提升查询效率,应结合实际业务场景进行优化设计。