数据库索引创建的核心原则与最佳实践
一、核心设计原则
最左前缀匹配原则
- 联合索引按字段顺序生效,如
(A,B,C)
索引支持A
/A,B
/A,B,C
查询,但跳过A
的条件无法触发索引。 - 范围查询(
>
/<
)后字段失效,如WHERE A>1 AND B=2
仅生效A
字段索引。
- 联合索引按字段顺序生效,如
高区分度字段优先
- 选择重复率低的字段(如
user_id
而非gender
),区分度建议>0.32。 - 公式:
区分度 = COUNT(DISTINCT(col)) / COUNT(*)
。
- 选择重复率低的字段(如
索引精简性原则
- 单表索引数建议≤5个,避免写操作性能下降。
- 扩展已有索引优于新建索引(如将
index(a)
改为index(a,b)
)。
覆盖索引优先
- 联合索引包含所有查询字段可避免回表,如
SELECT name FROM users WHERE age=30
使用INDEX(age,name)
。
- 联合索引包含所有查询字段可避免回表,如
禁止索引计算
避免在索引列使用函数或运算,如
WHERE YEAR(create_time)=2025
需改写为范围查询。
二、最佳实践策略
1. 索引类型选型
索引类型 | 适用场景 | 性能特点 |
---|---|---|
B+Tree | 精确匹配/范围查询(OLTP核心) | 读写均衡,支持排序 |
BRIN | 时间序列数据(如日志表) | 存储空间降低90%+ |
GIN | JSON/数组/全文检索 | 加速复杂数据类型查询 |
2. 分布式数据库优化
sql
-- GaussDB示例:全局分片索引 CREATE INDEX idx_orders_global ON orders USING GLOBAL (order_id) DISTRIBUTE BY HASH(order_id); -- 哈希分片加速节点并行查询:ml-citation{ref="6" data="citationList"}
3. 避坑指南
- 字符串索引:超长字段用前缀索引
sql
CREATE INDEX idx_name ON users (name(10)); -- 仅索引前10字符
- 更新频繁字段:避免为高频更新低查询字段建索引。
- NULL值处理:
IS NULL
条件需单独建立FILTERED INDEX。
三、实战检验标准
性能验证工具
- MySQL:
EXPLAIN ANALYZE。
- PostgreSQL:
pg_stat_statements。
- GaussDB:
EXPLAIN PERF
。
- MySQL:
关键指标
- 索引命中率:
>99%
- 回表比例:
<10%
(可通过覆盖索引优化)。 - 索引存储占比:不超过数据量的
30%。
- 索引命中率: