mysql数据库in函数查询是否走索引?
IN 通常是走索引的,当IN后面的数据在数据表中超过30%的匹配时是全表的扫描,不会走索引,因此IN走不走索引与后面的数据量有关系!
昨天恰好在工作中遇到了这个情况一个表有10万条数据,还有另外一个表有40万条数据,需要通过IN查询出对应的数据,整个完整过程的记录:
因为没有过滤掉无效的为零的数据所以查询的参数集合有数据2万条(2个表的任意一个都不足30%);
但实际是通过mybatis-plus分别查询两个表共耗时40~60秒不等;
通过过滤其中的为零的参数后,查询的参数的集合是16条,然后再通过mybatis-plus分别查询两个表共耗时100毫秒;
小结
-
IN 查询的参数数量只有比较小的时候才会走索引; (具体多少后续查询验证)
-
使用 IN 查询的参数如果是固定时;SELECT * FROM 表名 WHERE ( 查询字段 = 固定参数1 OR 查询字段 = 固定参数2 ) 这样的效率是最高的;
-
如果查询的参数集合比较大时建议使用 EXISTS 代替 IN 查询,效率会高很多!