暂无图片
MySQL 加上强制索引后查询反而更慢
我来答
分享
春眠不觉晓
2021-05-13
MySQL 加上强制索引后查询反而更慢
暂无图片 10M

环境: MySQL 5.6.16
【对表名和列名脱敏,SQL格式是完整的】

SELECT ID, 列2, 列3, 列4
FROM 表A
WHERE 时间列1 < ‘2020/5/13 16:00:20’
AND (时间列2 < ‘2020/5/13 16:00:20’ OR 时间列2 IS NULL)
AND 列4 IN (‘2’, ‘3’, ‘4’, ‘5’)
AND ID > XXXXX
ORDER BY ID
LIMIT 0, 200

这慢SQL在各库均要执行,时间条件是查询一年前 + 列4 条件不变 + id会变动。

列4 IN (‘2’, ‘3’, ‘4’, ‘5’) 的数据占总表3%~~~20%,再加上 AND ID > XXXXX 后数据量会更少。

MySQL自动执行计划是走主键,也就是ID列。 我强制走 force index (MemberGrade) 列索引,观察一个星期下来,在大部分库上的查询速度变快了,

但在小部分库查询速度反而下降几十倍【数据量变动很少】,这是什么原理?我强制走符合条件数据少的不是应该比走数据多的更快吗?

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
薛晓刚

你的时间就小于现在?没有大于什么吗?那不就几乎是全部吗?
来个大于的。因为你要求ID大于什么,我猜你ID是自增的或者,ID是越来越大的。那么说明你需要的是一个从何时到现在的。
另外你的时间还允许空这个不好。

暂无图片 评论
暂无图片 有用 0
春眠不觉晓

业务上逻辑是这样,不能改。

我的疑问是按正常,在这个SQL里,我指定了强制索引后需扫描的数据更少,为什么执行时间反而更长。

暂无图片 评论
暂无图片 有用 0
启荣

MemberGrade 是列4么?索引只包含一列?

暂无图片 评论
暂无图片 有用 0
春眠不觉晓

是的

暂无图片 评论
暂无图片 有用 0
chengang

如果能贴一个 慢的查询计划就好了。

难道是因为回表与排序花了更多时间?

可以试试建一个联合索引,完成上述语句的所有列,完成索引覆盖

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏