mysql语句中经常用到in,但从mysql老版本中经常看到使用in会导致的各种性能问题,
比如in中的值如果超过个或个就会导致sql性能大幅下降,甚至不走索引等种种问题
我们在mysql5.7中测试下,来看看该版本中in是否还存在如网上所说的问题
创建表:
CREATETABLE`a`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(45)DEFAULTNULL,
PRIMARYKEY(`id`),
KEY`name`(`name`)
)ENGINE=InnoDB
我们插入a表中十万级别的数据,然后进行下面测试
确定值查询
3个值查询情况
explainextended
select*fromawherenamein(,,);
个值的查询情况
explainextended
select*fromawherenamein(,……,);
通过上面两个不同个数的值的查询对比,执行计划是一致的,并没有出现网上所说的超过个就不走索引,小于就走索引的情况出现,所以我们得出结论in是肯定走索引的。
动态9个值查询
explainextended
select*fromawherenamein(selectnamefromaasbwhereid10);
动态个值查询
explainextended
select*fromawherenamein(selectnamefromaasbwhereid0);
我们发现动态的in查询计划也是一致的,并没有因为值的个数而不同。
综合上面的查询结果我们可以看到mysql5.7中in是可以很好的走索引,也并没有因为值个数而导致性能下降