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条以内时,将走索引

你可能感兴趣的:(mysql,数据库)