MySQL的in和or的效率问题

转自: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格式电子书等。

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

原文地址:https://www.cnblogs.com/hnzkljq/p/12620949.html

时间: 2024-08-14 04:44:13

MySQL的in和or的效率问题的相关文章

mysql source命令导入sql文件效率分析

Query OK, 24918 rows affected (0.90 sec)Records: 24918  Duplicates: 0  Warnings: 0Query OK, 24923 rows affected (2.26 sec)Records: 24923  Duplicates: 0  Warnings: 0Query OK, 24924 rows affected (2.74 sec)Records: 24924  Duplicates: 0  Warnings: 0Quer

MySQL使用rand 随机查询记录效率测试

以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的,以下就是文章的主要内容. SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低. You cannot use

mysql数据库添加索引优化查询效率

项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql>ALTER TABLE `ta

改进MySQL Order By Rand()的低效率

Author:flymorn Source:飘易Categories:PHP编程 PostTime:2011-1-14 15:35:07 正 文:   最近由于需要研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是: SELECT * FROM content ORDER BY RAND() LIMIT 1 .[飘易注:3万条记录查询花费 0.3745 秒(下同):从mysql slow query log看出"ORDER BY RA

mysql中RAND()随便查询记录效率问题和解决办法分享

在我们做开发的中效率一直是个问题,特别是对于很多大数据量操作,今天我们碰到一个要随机查询数据,一开始我们可能想到最简单的order by rand() 来操作但效率不敢恭维啊 最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 有两个方法可以达成以上效果. 1.新建一个表,里面存着 -5 至 5 之间的数.再利用order

Mysql explain分析sql语句执行效率

mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如: explain select * from news where id = 1; 输出: id select_type table type

mysql数据库的优化和查询效率的优化

一.数据库的优化 1.优化索引.SQL 语句.分析慢查询: 2.设计表的时候严格根据数据库的设计范式来设计数据库: 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO: 4.优化硬件:采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等: 5.采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率: 6.垂直分表:把一些不经常读的数据放在一张表里,节约磁盘I/O: 7.主从分离读写:采用主从复制把数据库的读操作和写入操作

mysql中or和in的效率问题

分三中情况进行测试,分别是:第一种情况:in和or所在列为主键的情形.第二种情况:in和or所在列创建有索引的情形.第二种情况:in和or所在列没有索引的情形.每种情况又采用不同的in和or的数量进行测试.由于测试语句的数据量有4种情况,我这里就称为A组.B组.C组.D组,其中A组为3个值,B组为150个值,C组为300个值,D组为1000个 ? 测试结果如下:第一种情况,ID列为主键的情况,4组测试执行计划一样,执行的时间也基本没有区别.A组or和in的执行时间: or的执行时间为:0.002

mysql 两表联查分页排序效率优化

数据库中有两张表 t1 存储消息信息 +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI |