SQL优化关于or与in使用
网上有很多人都在谈论or与in的使用,有的说二者没有什么区别,其实不然,估计是测试做的不够,其实or的效率为O(n),而in的效率为O(log2n),当基数越大时,in的效率就能凸显出来了。
有人做了这么一组实验(测试库数据为1000万条记录):A组分别用or与in查询3条记录,B组分别用or与in查询120条记录,C组分别用or与in查询500条记录,D组分别用or与in查询1000条记录.
第一种情况,目标列为主键的情况,4组测试执行计划一样,执行的时间也基本没有区别。
A组or和in的执行时间: or的执行时间为:0.002s in的执行时间为:0.002s
B组or和in的执行时间: or的执行时间为:0.004s in的执行时间为:0.004s
C组or和in的执行时间: or的执行时间为:0.006s in的执行时间为:0.005s
D组or和in的执行时间: or的执行时间为:0.017s in的执行时间为:0.014s
第二种情况,目标列为一般索引的情况,4组测试执行计划一样,执行的时间也基本没有区别。
A组or和in的执行时间: or的执行时间为:0.002s in的执行时间为:0.002s
B组or和in的执行时间: or的执行时间为:0.006s in的执行时间为:0.005s
C组or和in的执行时间: or的执行时间为:0.008s in的执行时间为:0.008s
D组or和in的执行时间: or的执行时间为:0.020s in的执行时间为:0.019s
第三种情况,目标列没有索引的情况,4组测试执行计划就不一样,执行的时间也有了很大的区别。
A组or和in的执行时间: or的执行时间为:5.016s in的执行时间为:5.071s
B组or和in的执行时间: or的执行时间为:1min 02s in的执行时间为:5.018s
C组or和in的执行时间: or的执行时间为:1min 50s in的执行时间为:5.010s
D组or和in的执行时间: or的执行时间为:6min 13s in的执行时间为:5.047s
结论:
in和or的效率,取决目标条件列是否有索引或者是否是主键,如果有索引或者主键性能没啥差别,如果没有索引,in的性能要远远优于or.
SQL优化关于or与in使用的更多相关文章
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- sql 优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...
- SQL 优化总结
SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects SELECT name as '函数名称',xtype as XType FROM s ...
- (转)SQL 优化原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- sql优化阶段性总结以及反思
Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- SQL优化有偿服务
本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
随机推荐
- Django知识点归纳总结之HTTP协议与URL
Django复习知识点归纳总结 1.HTTP协议 超文本传输协议(Hyper Text Transfer Protocol),是用于万维网服务器与本地浏览器之间的传输超文本的传送协议. HTT ...
- nginx重试机制proxy_next_upstream
nginx作为反向代理服务器,后端RS有多台服务器,上层通过一定机制保证容错和负载均衡. nginx的重试机制就是容错的一种 官方链接:http://nginx.org/en/docs/http/ng ...
- seaborn---画热力图
1.引用形式: seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None ...
- springboot ResponseEntity<byte[]> 下载文件 byte 都变成base64
因为spring boot消息转换器 ,全部将数据转换为json格式,包括文件的byte数据 关于spring boot 的消息转换器见:https://www.jianshu.com/p/ffe56 ...
- 快速了解前端打包 webpack
一.介绍 (1)概念 webpack 用于编译 JavaScript 模块,是 JavaScript 静态模块的打包工具.从 webpack v4.0.0 开始,可以不用引入一个配置文件. (2)核心 ...
- Mysql的安装与环境的配置
Mysql的安装与环境的配置 这里以Mysql5.5为例: (1)双击安装包,点击next (2)选择自定义,点击Next (3)修改路径,点击Next (4)选择精确配置,点击Next (5)选择开 ...
- refPoint 别名与指针
// refPoint.cpp : Defines the entry point for the console application. // #include "stdafx.h&qu ...
- Spring Boot 2.x(十六):玩转vue文件上传
为什么使用Vue-Simple-Uploader 最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件--Vue-Simple- ...
- js回调与异步加载的用法
以前还是菜鸟的时候(虽然现在依然很菜 -_-|| )对异步加载与回调函数的技术无比向往,但也一直没有使用过,这次因为页面逻辑太过复杂,一堆请求逻辑,如果还是用顺序请求,页面的速度... 领导又要挠头了 ...
- spi调试步骤,mcp2515调试整理
1.先查看也硬件电路,一般都是单片机作为master,其他芯片作为slave.单片机的MOSI对应从机的SI,单片机的MISO对应从机的SO,如果两个引脚接反了,那是怎么调试都没有效果的. 2.单片机 ...