事务
隔离级别
如何防止脏读/幻读
- 隔离级别上来讲
- 锁机制上来来讲
索引
B+ 树索引 & 哈希索引
B+树与哈希索引的核心区别在于数据结构与适用查询类型。 B+树是平衡多叉树,支持范围查询和排序,适合磁盘存储的OLAP场景; 哈希通过哈希函数实现O(1)等值查询,但无法处理范围操作,常用于内存键值存储。 两者在数据库中常协同使用,如InnoDB的自适应哈希优化热点查询。 选型需结合查询模式(等值/范围)、数据分布(键冲突率)及存储介质(磁盘/内存)综合评估
-
查询性能角度来讲
- 哈希索引的等值查询性能是 O(1),理论上最快
- B+ 树索引的查询性能是 O(log n),但支持范围查询
- 对于频繁的单点等值查询场景
- 例如 Redis 中的键值存储,哈希索引表现更佳
- MySQL Memory 引擎默认使用哈希索引就是看中其等值查询性能
-
数据组织结构角度来讲
- B+ 树是一种多路平衡查找树,有序存储数据
- 哈希索引基于哈希表实现,无序存储数据
- B+ 树的叶子节点包含所有数据并且通过链表连接
- 这种结构使得 B+ 树天然支持范围扫描和排序操作
- InnoDB 引擎的主键索引就是一个 B+ 树结构
-
功能支持角度来讲
- B+ 树索引支持全键值匹配、范围查询和前缀匹配
- 哈希索引只支持等值查询,不支持排序和范围查询
- B+ 树索引可用于实现 ORDER BY 和 GROUP BY 操作
- 例如
SELECT * FROM user WHERE age > 20 ORDER BY id - 哈希索引无法利用索引完成排序,需要额外排序操作
- 例如
-
空间与维护开销来讲
- 哈希索引结构简单,内存占用相对较小
- B+ 树索引需要维护树的平衡性,占用空间较大
- 当数据频繁变化时
- B+ 树可能需要频繁的节点分裂和合并操作
- 哈希索引可能面临哈希冲突和扩容问题,需要rehash
-
实际应用选择来讲
- 关系型数据库主流选择 B+ 树索引
- MySQL InnoDB、PostgreSQL、Oracle 等都以 B+ 树为主
- 适合复杂查询场景,支持范围条件和排序
- NoSQL 数据库常用哈希索引
- Redis、Memcached 等键值存储使用哈希索引
- MongoDB 对于非主键索引使用 B 树,对 _id 使用哈希索引
- 有些数据库支持同时使用两种索引类型
- MySQL 的 Memory 引擎支持同时使用哈希索引和 B+ 树索引
- PostgreSQL 允许创建 hash 和 btree 类型的索引
- 关系型数据库主流选择 B+ 树索引
