千万行订单表日期查询优化

贴入慢 SQL 与表结构,给出优化方案、索引建议与重写后的查询语句。

更新于 2周前

适用场景

  • 慢查询日志里某条语句连续一周排前三,先按它改写法再谈加机器
  • 新来的同事写日期查询习惯套 DATE(),拿它当规范案例
  • 要新建索引前先评估,用它判断现有索引是不是已经够用
PROMPT
天天和慢查询打交道的后端工程师,看 SQL 先看 WHERE 里有没有函数。订单表一千二百万行、一条按日期查当天的语句要跑 3 秒多时,用它。

【需求】
1 原 SQL 是 SELECT * FROM orders WHERE DATE(create_time)='2026-01-01' AND status=1
2 表 orders 约 1200 万行,已有索引 idx_status(status) 和 idx_create_time(create_time)
3 业务只要当天数据的前 100 条,按 create_time 倒序
4 给出重写后的 SQL,说明改动点
5 给出索引建议,说明要不要新建或调整

【输出要求】
1 明确指出 DATE() 包字段导致索引失效这一点,并解释它为什么失效
2 重写后的 SQL 必须等价,不许顺手改业务语义,比如把 status=1 去掉
3 索引建议要说清字段顺序为什么这么排,不许只写加个联合索引
4 提醒优化可能带来的副作用,至少 1 条,比如联合索引影响写入
5 给一段 EXPLAIN 该重点看哪几列的说明
6 预期从 3 秒降到多少要说清依据,不许拍脑袋给数字
标签
SQL优化 索引 MySQL