MYSQL的IN查询效率慢的问题
最近项目的老代码又出问题了,mysql的in查询一次查询了5万个数据,cpu一下飙升到100%,这条查询sql也运行的近600s,那么是什么原因导致mysql的in查询效率如此之低,并且没有走索引呢?
1. 类型转化
select * from test_table where test_id in ();
此sql的test_id在表中是BIGINT
类型,但是代码中传入的List
类型,有可能是类型转化的问题,导致sql没有走索引,但是经过explain排查sql之后,排除了这个可能。
原因是如果MYSQL表中的test_id字段类型是int类型的,无论传入的参数是varchar类型还是int类型都会走索引;如果MYSQL表中的test_id字段类型是varchar类型的,只有在传入的参数是int类型的才会走索引,而传入varchar类型的将不会走索引。
2. IN的取值范围较大
因为本次的查询sql的in查询的范围大约有5万条,当IN的取值范围较大时会导致索引失效,走全表扫描。
那么IN的取值范围有多少条的时候会走索引呢?
新建了一张表,test_id有索引,插入了30万的数据。
explain上述sql,发现in的取值范围在10000条以内的时候,此条查询走索引。
但是一旦in的取值范围超过10000条后,将不会走索引。
3. 总结
当然在in的字段添加了索引的情况下,最终in走不走索引由mysql 优化执行器去判断,此底层逻辑较为复杂,但是在笔者的条件下,in的取值范围限制在10000条以内时,将走索引。
来源地址:https://blog.csdn.net/alidingding/article/details/131627160
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341