← 中文资源

简体中文版本

数据库索引

索引是帮助引擎避免全表扫描的辅助结构,用写入成本和存储换取更快的读取。

阅读英文原文

工作原理

关系型索引多为 B-tree:有序页组成根、分支和叶子节点,支持对数查找和有序范围扫描。复合索引按从左到右排序,(customer_id, created_at) 能服务按客户过滤并按时间排序,却不能单独服务只按 created_at 的过滤。覆盖索引包含额外列,使查询无需回表。

CREATE INDEX orders_customer_created_idx
  ON orders (customer_id, created_at DESC);

EXPLAIN (ANALYZE, BUFFERS)
SELECT id, total FROM orders
WHERE customer_id = 42
ORDER BY created_at DESC LIMIT 20;

使用场景与取舍

为高频、选择性强的过滤和连接列建索引,也为排序或唯一性建索引。用 EXPLAIN 和真实数据分布验证计划。与反规范化或缓存相比,索引保持单一事实源并直接改善查询,但无法修复形状糟糕的查询。

每个索引都增加存储、写放大和维护成本。低选择性索引可能输给顺序扫描;无用索引纯属开销,重复索引浪费空间。对索引列使用函数、统计信息陈旧或类型不匹配,都可能让规划器放弃好索引。

具体示例

一张订单表按客户和时间查询很慢,添加复合索引后计划从顺序扫描变为索引扫描,读取页数显著下降。上线后还要监控写延迟和索引使用率,删除从未被使用的索引。