ORDER BY id 为何效率不高
背景
系统代码中有以下查询SQL,DBA要求优化;
SELECT id,
user_id,
patient_id,
his_id,
bill_no,
log_model
FROM platfom_fee_log
WHERE fee_channel = 2
AND gmt_create >= '2018-12-24 01:05:00'
AND gmt_create <= '2018-12-25 07:58:00'
AND (id_no = '370281198211092363' OR guarder_id_no = '370281198211092363')
ORDER BY id DESC
LIMIT 0,10
DBA验证的结论:
上述 sql 需要优化,现在 200s 返回,优化后 0.54s。order by id 改为 order by gmt_create
思考点
为什么order by id不行,而 order by gmt_create 效果更好?
DBA给出原因为:
order by id,mysql 的优化器会选择主键索引,但是 where 条件里又没有主键条件,导致全表扫描。
order by gmt_create,结合 where 条件里 gmt_create ,mysq 优化器会选择 gmt_create 索引,扫描的记录数少,效果更好。
知其然知其所以然
在这篇博客中有进一步的解释;
更多详见Google