联合索引的目标不是把查询中的字段全部拼进去,而是用尽可能少的索引覆盖稳定、高频且重要的访问路径。
字段顺序
通常先放等值条件,再放范围条件,最后考虑排序和覆盖字段。但这不是机械规则。字段选择性、查询频率和是否能避免排序都可能改变答案。例如租户系统常把 tenant_id 放在首位,是为了隔离访问范围并方便索引复用。
select id, status, created_at
from orders
where tenant_id = ? and status = ? and created_at >= ?
order by created_at desc
limit 20;
可尝试 (tenant_id, status, created_at),然后用 EXPLAIN ANALYZE 观察扫描行数、实际耗时和是否出现额外排序。
避免索引膨胀
每个二级索引都会增加写放大和缓存压力。低频查询不一定值得单独建索引,重复前缀索引也应合并。上线前用接近生产的数据量验证,上线后持续观察慢查询,而不是把 Using index 当成唯一成功标准。