浅析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的效率问题,主要反思一点就是:如果在网上看到的结论,没有官方文档出处,建议大家还是不要轻易相信。一定要自己研究到源码或者官方文档才可靠。另外大家在开发过程中遇到问题一定要优先去看核心技术源码,优先看官方文档而不是不想就问,不想就去百度。

posted @   古兰精  阅读(892)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示