浅析MySQL的in和or的效率问题
一、实验结论
这里有一篇文章有做实验:mysql中or和in的效率问题,分三中情况进行测试,分别是:
第一种情况:in和or所在列为主键的情形
第二种情况:in和or所在列创建有索引的情形
第二种情况:in和or所在列没有索引的情形
最后得出的结论如下:
1、in或or在字段有添加索引的情况下,查询很快,两者查询速度没有什么区别;
2、in或or在字段没有添加索引的情况下,所连接的字段越多(1or2or3or4or......),or比in的查询效率低很多。
在StackOverFlow里,我也搜到了一些答案,典型的如下:
有人做了实验,通过他的对比,也是In的效率更高。
还有这个回答:说是引用至《高性能MySQL》
大致翻译下,意思是说:
在很多数据库里,In和or是等价的,因为他们逻辑是相等的。但是,在MySQL中会对 in 中的列表排序,排序用的是二分查找来判断是否在列表中。in 的时间复杂度是O(logn) ,而or的时间复杂度是O(n),这就意味着In的效率更高。
另外还有人说范围查找比 in 效率还高。
我觉得这个解释还是比较靠谱的。
二、官方文档
地址:https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in
简单翻一下:列表中的值被排序,expr的搜索使用二进制搜索完成,这使得IN()操作非常快速。
可以看到官方文档和上面的解释非常类似,效率很高。
思考:以前一直在文章上看到说 in 就是用 or 实现的,是等价的,没什么区别。现在专门分析了下MySQL中In和or的效率问题,主要反思一点就是:如果在网上看到的结论,没有官方文档出处,建议大家还是不要轻易相信。一定要自己研究到源码或者官方文档才可靠。另外大家在开发过程中遇到问题一定要优先去看核心技术源码,优先看官方文档而不是不想就问,不想就去百度。