暂无图片
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
打赏 0
春眠不觉晓

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

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

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

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

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

是的

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

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

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

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

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
ERROR 1064: You have an error in your SQL syntax?我能看到具体哪行不?
回答 1
已采纳
在错误信息中,通常不会直接指示具体的行数或位置,而是提供一个大致的错误位置。错误代码"1064"表示SQL语法错误,但它不会提供具体的行数或位置。
MySQL ocp 最新题库可以从哪里获取?
回答 4
MySQL8.0OCP最新中文考试题库(如需完整版请联系作者)https://www.modb.pro/db/1703602138349916160
Windows下mysql版本升级报错
回答 4
已采纳
是老的mysql的环境变量没删除导致的,记录一下这个经验
MySQL的RPM包的用途说明
回答 1
已采纳
server所有服务器的二进制文件,配置和数据库common服务器端和客户端通用文件client连接到数据库库服务器的所有客户端组件devel编译mysql程序需要的库libs共享库libscompa
mysql数据库中一个账户可以多个主机同时登录吗?
回答 1
已采纳
当然是可以的
innodb cluster set可以只读吗?
回答 1
已采纳
可以,参考https://www.modb.pro/db/1696336849929326592
mysql如何实现oracle的instr功能,可以指定开始检索的位置?
回答 2
mysql支持instr函数,和oracle上的instr用法一样
有哪位可以帮我解答下udev规则?KERNEL=="dm-*",ENV{DM_UUID}=="mpath-222020001551e58d8",OWNER="grid",GROUP="asmadmin",MODE="0660"这个规则改不了权限
回答 3
multipath多路径可以参考这样的写法,要用12,用mapper出来的盘符名绑定即可cat/etc/udev/rules.d/12dmpermissions.rulesENV{DMNAME}“da
硬盘Random读写速度对MySQL数据库业务有影响吗?
回答 1
有影响https://blog.51cto.com/u508239/223542http://blog.itpub.net/30310891/viewspace2787997/
MySQL 触发器是第一时间执行的吗?
回答 1
MySQL触发器是在触发事件之后立即执行,但在触发器执行期间,其他会话可能能够读取数据,取决于事务隔离级别和锁策略例如,如果使用MySQL的默认隔离级别可重复读(REPEATABLEREAD)隔离级别