Hash 索引和 B/B+ 树索引
1. Hash 索引
为什么 MySQL 没有使用 Hash 索引?
- Hash 冲突问题: Hash 索引是通过哈希函数将键映射到一个固定大小的数组索引位置。如果两个不同的键产生相同的哈希值,就发生了冲突。解决冲突的方法有开放寻址法和链表法,但这增加了复杂性。
- 不支持范围查询和顺序查询: Hash 索引适用于等值查询,但不适用于范围查询和排序操作。在实际数据库查询中,范围查询和排序是非常常见的,而 Hash 索引无法提供这种支持。
2. B 树和 B+ 树
B 树和 B+ 树的异同:
-
节点结构:
- B 树: 所有节点都存放键和数据。
- B+ 树: 内部节点只存放键,所有数据都存放在叶子节点。
-
叶子节点结构:
- B 树: 叶子节点独立,之间没有直接关联。
- B+ 树: 叶子节点通过链表连接,形成有序的叶子节点列表。
-
范围查询:
- B 树: 在范围查询时,可能需要中途停止,效率较低。
- B+ 树: 范围查询可以从叶子节点开始,按顺序遍历叶子节点,效率较高。
-
适用场景:
- B 树: 更适用于存储在磁盘等随机访问存储介质中。
- B+ 树: 更适用于存储在内存等顺序访问存储介质中。
-
非叶子节点的作用:
- B 树: 非叶子节点既存放键也存放数据。
- B+ 树: 非叶子节点只存放键,数据仅在叶子节点。
在实际数据库系统中,B+ 树索引被广泛应用,因为它适用于范围查询、顺序访问,且通过有序的叶子节点链表可以更方便地进行范围查询。 MySQL 中的 InnoDB 存储引擎就使用了 B+ 树索引。