一、问题背景
数据库索引需要同时满足:
- 等值查询:
SELECT * FROM user WHERE id = 1234 - 区间查询:
SELECT * FROM user WHERE id > 1000 AND id < 2000 - 低内存占用:索引可能对应上亿条数据,不可能全部放内存
- 高写入性能:插入/删除时索引维护代价不能太高
为什么散列表、平衡二叉树、跳表都不够好?
| 数据结构 | 等值查询 | 区间查询 | 磁盘友好 |
|---|---|---|---|
| 散列表 | O(1) | ❌ 不支持 | 一般 |
| AVL/红黑树 | O(log n) | 需中序遍历 | ❌ 树高大,IO 多 |
| 跳表 | O(log n) | ✅ 链表遍历 | 一般 |
| B+树 | O(log_m n) | ✅ 叶子链表 | ✅ 矮胖,IO 少 |