对in或者or又或者union进行简单的耗时测试

在前段时间,工作中遇到in或or的选择,其他人坚持要用or,当时的数据库是sqlserver,因为多种因素,所以当时没有经过实际测试,就先用or了。

今天在某个项目的数据库设计时,让我想起前面这么一回事,所以就有了这个测试了。

环境

我用的是linux 64位系统,mysql 5.5.46数据库,所有都是默认配置

准备工作

1、建表t_user,只有两个字段,id为主键并自增,name为varchar(20),都是非空字段,语句如下

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

需要注意,这里没有特别建立索引

 

2、先插入100万条记录,我写了点java代码做插入记录的工作,并用java构造了in\or\union all的查询语句,插入记录的工作就不详细说了,这里先对name字段(没有索引的)进行查询测试,后面给上各个sql语句

#or#
select sql_no_cache * from t_user where name='10' or name='11' or name='13' or name='18' or name='11' or name='15' or name='18' or name='15' or name='14' or name='17';

#in#
select sql_no_cache * from t_user where name in('10','11','13','18','11','15','18','15','14','17');

#union all#
select sql_no_cache * from t_user where name='10' union all select * from t_user where  name='11' union all select * from t_user where  name='13' union all select * from t_user where  name='18' union all select * from t_user where  name='11' union all select * from t_user where  name='15' union all select * from t_user where  name='18' union all select * from t_user where  name='15' union all select * from t_user where  name='14' union all select * from t_user where  name='17' ;

上面分别是10个条件,其他的数量可以自行构造

我是直接在mysql的命令窗口直接执行上面的语句,前面的三种情况在不同数量的查询条件下的查询结果分别如下(分别测试了10、100和1000个条件)

10 100 1000 10000
or 0.62 4.45 56.54 ---
in 0.29 0.31 0.35 0.40
union 2.65 25.68  261.64 ---

注:通常情况下,一次查询语句里的条件数量不会到“千”级,最多情况为“十”和“百”,但基于个人兴趣,我也试了in在“万”级的耗时,所以上面在“万”级别只有in有数据。

初步结果

如上结果可以看到,in的时间是最短的,or和union的用时几乎与其查询条件的数量成正比,总体上,耗时从小到大的顺序为:in<or<union。

进阶

到这里还没结束,我们可以使用mysql提供的explain执行上面三种情况的sql语句(这里补贴结果了,有兴趣的可以自己试试),到这里我们可以得到两个观点:

1、不管是in还是or,其explain出来的结果一模一样,也就是可以认为其执行过程是一样的

2、union是根据条件数目,耗时是正比递增。

于是,有人可能就会问,那为啥前面的or和in的时间还是会差很多呢?我也没有深入研究过,可能是在执行前对sql语句的解析花了较多时间吧(对这个有兴趣的,可以深入了解数据库在处理sql查询的整个过程)

 

结论

综上测试,在通常情况下(这里指相对比较简单的查询条件下),in的效率还是蛮高的,另外,in拼接出的sql语句也是最短的!

 

引申

sqlserver是否也是这样呢?元芳,你怎么看?

 

这里算是结束了~

 

» 本文链接地址:https://www.xidige.com/913

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区1人评论534人参与
  1. 20230287 2016年1月3日 下午5:33  回复

    看看!

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告