mysql5.7 同个查询语句,之前索引类型是range,现在是index merge,麻烦指点

mysql5.7 同个查询语句,之前索引类型是range,现在是index merge,麻烦指点
最近服务器有维护,但是表结构和索引没有变化,之前这个查询type是range,key包含pay_time的,现在变成了index_merge,key不包含pay_time,查询速度从原本的2S变成了20S,
目前能想到的解决办法
1.加联合索引测试效果(实际表很大,能不加尽量不加),
2.关闭index_merge(但是会降低其他查询的效率)
但是感觉都不大合适,麻烦指点一下,也还很困惑出现问题的原因

找了个测试环境,同样的表结构和索引,同样5.7,tpye也是range
mysql5.7 同个查询语句,之前索引类型是range,现在是index merge,麻烦指点

PS:下面的内容如果误导了麻烦请无视
PS:这次维护后还遇到了group子查询里order by不生效的情况,后面子查询加了limit先处理了,总结可能是2个月前mysql从5.6升级到5.7后导致的,但是比较奇怪的是之前都是正常的,就这两天不一样,这两天mysql没有重启过或修改配置

最佳答案

最主要的问题是两次使用的索引不一样。使用哪个索引,是执行优化器来处理的。第二次没有使用pay_time索引,可能是pay_time的区分度并不大,而area_code区分度比较大。怎么查看区分度?使用你的sql中的pay_time来查个count,和使用sql中的area_code来查个count。对比一下。

4周前 评论
讨论数量: 2

最主要的问题是两次使用的索引不一样。使用哪个索引,是执行优化器来处理的。第二次没有使用pay_time索引,可能是pay_time的区分度并不大,而area_code区分度比较大。怎么查看区分度?使用你的sql中的pay_time来查个count,和使用sql中的area_code来查个count。对比一下。

4周前 评论

谢谢,最后我先用了强制索引处理的,确实pay_time的count数值比area_code 和show_if 的大,优化器选了小的,我主要奇怪的是 数据量基本不会大变化的情况, 原本我的查询固定是使用paytime作为索引的,最近突然变了

4周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!