浅析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的效率问题,主要反思一点就是:如果在网上看到的结论,没有官方文档出处,建议大家还是不要轻易相信。一定要自己研究到源码或者官方文档才可靠。另外大家在开发过程中遇到问题一定要优先去看核心技术源码,优先看官方文档而不是不想就问,不想就去百度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律