数据库索引
数据库索引通过额外维护有序或可定位的数据结构来降低查询成本,但会带来写入和维护开销。
#type / concept
#status / growing
#tech / dev / backend
#resource / database
[!info] related notes
- 所属 MOC: 数据库 MOC
- 前置概念: SQL
- 并列概念: SQL 查询执行流程
- 易混淆概念:
- 关系笔记: MySQL 与 PostgreSQL 的数据类型差异
数据库索引
一句话定义
索引是数据库为加速查找而额外维护的数据结构,本质上是“用空间换时间”。
核心机制 / 工作原理
如果没有索引,数据库常常只能做全表扫描;有了索引后,可以更快定位:
- 精确匹配
- 范围查询
- 排序
- 某些连接条件
常见索引结构:
- B-Tree:最常见,支持范围查询和排序
- Hash:适合等值查询,但功能较窄
- PostgreSQL 扩展索引:如 GIN、GiST、BRIN
索引并不是越多越好,因为:
- 写入时要同步维护索引
- 占用额外存储
- 优化器可能选错,或统计信息过旧
最小例子 / 最小场景
如果经常按邮箱查用户:
CREATE INDEX idx_users_email ON users(email);
那么:
SELECT *
FROM users
WHERE email = 'alice@example.com';
通常就比全表扫描更容易走索引。
边界与易混淆点
- 索引不是语法糖,它会改变存储结构和写入成本。
- 有索引不代表一定会用到,是否使用取决于查询条件、选择性和优化器判断。
- 单列索引和联合索引的适用场景不同,排序列与过滤列的顺序也会影响效果。