不要再误解MySQL in的用法了!

文 / @WordPress主题

MySQL中的in操作符一直以来都是备受开发者们青睐的,它可以代替大量的"OR"操作符,将多个条件组合起来,减少了开发者的代码量和复杂度。然而,很多人对于in操作符的使用情况存在着一个误解,即认为只要用了in操作符就一定能够走索引,实际上,这种认知是错误的,大家都被不少转载的文章所欺骗了!

实际上,真正影响in走不走索引的是in中符合条件的数据占比多少,从而影响MySQL是否走索引!之前有人测试发现,符合in条件的数据超过40%(这个阀值不一定是40%,只是之前测试的结果),之后就开始走全表,不走索引。下面我们来看一下实践的例子。

在下面这个例子中,我们通过explain来分析了一个类似于“select * from test where id in (1,2,3,4,5,6,7,8,9,10)”这样的SQL语句的执行情况。当不考虑回表影响、覆盖索引的情况下,in中符合数据占整表数据较多的时候,会开始走全表扫描,不走索引。如下图:

![in操作符实验结果](https://img-blog.csdn.net/20180723150652838?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BocGJhZG9uZ19jb20=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)

上图中的Extra列值显示的是"Using where",表示MySQL需要在过滤给定条件之后,再一步步判断是否需要使用索引。另外需要说明的是:

1.当in单个值的时候,MySQL会自动优化为"=",故还是会走索引。
2.当in和select的列为同个的时候,由于不需要走回表的情况下,会走覆盖索引。

最后,推荐开发者们多关注一些优秀的MySQL学习资源,比如MySQL视频教程,这样可以更好地了解MySQL运行机制和内部实现,提高自己的开发水平。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。