精华 记一次线上慢 SQL 优化:从 12s 到 80ms

MySQL 5300 浏览 3 回复 2026-09-08 23:12
👍40
⭐收藏
DBA老赵 楼主 Lv7 ・印度
2026-09-08 23:12 5300 阅读 3 回复

原 SQL:

SELECT * FROM orders WHERE DATE(created_at) = CURDATE() AND status = 1;

问题:对索引列用了函数,导致全表扫描 800 万行。

优化后:

SELECT id, order_no, amount FROM orders \nWHERE created_at >= CURDATE() AND created_at < CURDATE() + INTERVAL 1 DAY \nAND status = 1;

再加联合索引 (status, created_at),并改成覆盖索引,耗时 80ms。

MySQL 精华
回复 👍 8
全部回复 3 条
编程小白鸭 ・韩国

原来函数会导致索引失效,学到了!

Lv3 2026-09-09 00:07 2 楼
回复 👍 45

补充:如果一定要按天统计,可以加一个冗余字段 create_date 存日期,直接建索引。

Lv8 2026-09-09 00:49 3 楼
回复 👍 94
大数据老刘 ・中国台湾

数据量再大建议上 ES 或者离线预聚合到统计表。

Lv5 2026-09-09 01:04 4 楼
回复 👍 62
发表回复
登录 后参与回复