最近项目的老代码又出问题了,Mysql的in查询一次查询了5万个数据,cpu一下飙升到100%,这条查询sql也运行的近600s,那么是什么原因导致mysql的in查询效率如此之低,并且没有走索引呢?
最近项目的老代码又出问题了,Mysql的in查询一次查询了5万个数据,cpu一下飙升到100%,这条查询sql也运行的近600s,那么是什么原因导致mysql的in查询效率如此之低,并且没有走索引呢?
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类型的将不会走索引。
因为本次的查询sql的in查询的范围大约有5万条,当IN的取值范围较大时会导致索引失效,走全表扫描。
那么IN的取值范围有多少条的时候会走索引呢?
新建了一张表,test_id有索引,插入了30万的数据。
explain上述sql,发现in的取值范围在10000条以内的时候,此条查询走索引。
但是一旦in的取值范围超过10000条后,将不会走索引。
当然在in的字段添加了索引的情况下,最终in走不走索引由mysql 优化执行器去判断,此底层逻辑较为复杂,但是在笔者的条件下,in的取值范围限制在10000条以内时,将走索引。
来源地址:https://blog.csdn.net/alidingding/article/details/131627160
--结束END--
本文标题: MYSQL的IN查询效率慢的问题
本文链接: https://www.lsjlt.com/news/402571.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
2024-05-03
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0