MySQL的btree索引和hash索引的区别

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(默认)

选择合适的索引类型能够显著提升查询效率,应结合实际业务场景进行优化设计。

你可能感兴趣的:(MySQL,哈希算法,mysql,算法)