MySQL的in和or的效率问题浅析

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL的in和or的效率问题浅析

一、背景

今天有个朋友问题“MySQL的In语句和or哪个效率更高一些?”


对于这个问题大多数人可能都是通过百度直接拿答案,然后就没然后了。


本文将对此问题简要进行分析。


二、分析

接下来我们要干啥??我们应该去百度对吧?!


别急,我们的套路是想想有哪些可以查询和解决这个问题的途径。


2.1 自己动手丰衣足食

自己创建一个表,然后塞n多数据,分表将查询的字段无索引和创建唯一索引,创建普通索引都对比一下。


(我这里暂时不做)


可以得到一些亲身的经验。


2.2 看源码

MySQL明显不是Java写的,而且捯饬源码不容易,我们还是先放弃吧。


2.3 搜索引擎

我们搜到了一篇,有类似的https://www.cnblogs.com/lixiuyuan999/p/6368871.html


做了一些实验结论如下:


结论:


1.in或or在字段有添加索引的情况下,查询很快,两者查询速度没有什么区别;


2.in或or在字段没有添加索引的情况下,所连接的字段越多(1or2or3or4or......),or比in的查询效率低很多


都有一些其他的类似结论,确实可以直接得到答案挺省事,但是总感觉不太权威。


2.4 SOF

其实可以在google里搜,但是你懂得....


我们还是从StackOverFlow里搜吧。


我们搜到了一些答案,典型的如下:


https://stackoverflow.com/questions/782915/mysql-or-vs-in-performance


我们知道有人做了实验,通过他的对比,也是In的效率更高。


还有这个回答


我们了解了更多,知道了在很多数据库里In和or是等价的,因为他们逻辑是相等的。


但是在MySQL中会对in中的列表排序,排序用的是二分查找来判断是否在列表中。in的时间复杂度是O(logn)而or的时间复杂度是O(n),这就意味着In的效率更高。


另外还有人说范围查找比in效率还高!!


还有一些其他的说法,让我们大开眼界。


虽然如此,我们还是不放心怎么办??处女座,强迫症肿么办??


2.5 官方文档大法

https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in


和上面的2.4第二个解释非常类似。效率很高。


三、问题来了

总体来说,In的效率更高一些。


那么MySQL中in有没有长度限制???

前面几个步骤就不重复了,直接看官方手册https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in


The number of values in the IN list is only limited by the max_allowed_packet value.


in的数据量受限于 max_allowed_packet的值。


很贴心的给了我们一个超链接https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_allowed_packet


max_allowed_packet表示最大允许接收的包大小。mysql 8.02及其之前版本默认大小是4194304字节(即4M)。


到此结束了??no!!

大概可以传多长的字符呢??


如果都是数字和字母,则按一个字符1字节,默认可传400多万个字符,因此常规使用不用担心。


啥时候需要调呢?


官方贴心的告诉你:


You must increase this value if you are using large BLOB columns or long strings. It should be as big as the largest BLOB you want to use. The protocol limit for max_allowed_packet is 1GB. The value should be a multiple of 1024; nonmultiples are rounded down to the nearest multiple.


官方贴心地提示你:


如果你用大blob列或者长字符串必须设置大一些。应该是你可能用到的最大BLOB的大小。协议限制1GB。这个值必须设置为1024的倍数,如果不是则自动取最近的1024的倍数字节。


结束了?

请看官方在线文档的左下角,官方很贴心得为我们提供了PDF格式的电子书,提供了HTML格式电子书等。


难道不感动吗?难道有理由不去下载吗?


四、总结

本文简单研究了MySQL中In和or的效率问题,教大家如何去研究这一类问题,后面类似的问题都可以沿着这个思路搞。


大家如果不研究到源码或者官方文档就不要太过轻信。


另外研究这类问题时相关的问题也要顺便了解和研究一下。


另外大家开发过程中一定优先看核心技术展源码,优先看官方文档而不是不想就问,不想就去百度。


另外不一定要等到遇到问题再去查,没事也可以主动去看。


创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 关系型数据库 MySQL
【MySQL专题】MySQL百万级数据插入效率优化
【MySQL专题】MySQL百万级数据插入效率优化
585 0
【MySQL专题】MySQL百万级数据插入效率优化
|
存储 缓存 关系型数据库
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)下
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)下
119 0
|
存储 缓存 关系型数据库
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)中
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)中
114 0
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)中
|
SQL 存储 Oracle
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)上
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)上
172 0
59. MySQL索引是如何提高查询效率的呢?(MySQL面试第二弹)上
|
存储 Oracle 关系型数据库
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
121 0
[MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
|
关系型数据库 MySQL 数据库
mysql之数据库添加索引优化查询效率
mysql之数据库添加索引优化查询效率
|
SQL 存储 算法
MySQL的优化——提升大量数据查询效率的神器(二)
MySQL的优化——提升大量数据查询效率的神器
295 0
MySQL的优化——提升大量数据查询效率的神器(二)
|
SQL 存储 关系型数据库
MySQL的优化——提升大量数据查询效率的神器
MySQL的优化——提升大量数据查询效率的神器
358 0
MySQL的优化——提升大量数据查询效率的神器
|
存储 关系型数据库 MySQL
每日一面 - mysql中,我存十亿个手机号码,考虑存储空间和查询效率,怎么设计?
每日一面 - mysql中,我存十亿个手机号码,考虑存储空间和查询效率,怎么设计?
|
存储 关系型数据库 MySQL
MySQL下count(*)、count(1)和count(字段)的查询效率比较
COUNT(*)和COUNT(1)都是对所有结果进行计算。如果有WHERE子句,则是对所有符合筛选条件的数据行进行统计;如果没有WHERE子句,则是对数据表的数据行数进行统计。
364 0