or/in/union与索引优化
假设订单业务表结构为:
order(oid, date, uid, status, money, time, …)
其中:
- oid,订单ID,主键 
- date,下单日期,有普通索引,管理后台经常按照date查询 
- uid,用户ID,有普通索引,用户查询自己订单 
- status,订单状态,有普通索引,管理后台经常按照status查询 
- money/time,订单金额/时间,被查询字段,无索引 
- … 
假设订单有三种状态:0已下单,1已支付,2已完成
业务需求,查询未完成的订单,哪个SQL更快呢?
- select * from order where status!=2 
- select * from order where status=0 or status=1 
- select * from order where status IN (0,1) 
- select * from order where status=0 - union all - select * from order where status=1 
结论:方案1最慢,方案2,3,4都能命中索引
但是...
一:union all 肯定是能够命中索引的
select * from order where status=0
union all
select * from order where status=1
说明:
- 直接告诉MySQL怎么做,MySQL耗费的CPU最少 
- 程序员并不经常这么写SQL(union all) 
二:简单的in能够命中索引
select * from order where status in (0,1)
说明:
- 让MySQL思考,查询优化耗费的cpu比union all多,但可以忽略不计 
- 程序员最常这么写SQL(in),这个例子,最建议这么写 
三:对于or,新版的MySQL能够命中索引
select * from order where status=0 or status=1
说明:
- 让MySQL思考,查询优化耗费的cpu比in多,别把负担交给MySQL 
- 不建议程序员频繁用or,不是所有的or都命中索引 
- 对于老版本的MySQL,建议查询分析下 
四、对于!=,负向查询肯定不能命中索引
select * from order where status!=2
说明:
- 全表扫描,效率最低,所有方案中最慢 
- 禁止使用负向查询 
五、其他方案
select * from order where status < 2
这个具体的例子中,确实快,但是:
- 这个例子只举了3个状态,实际业务不止这3个状态,并且状态的“值”正好满足偏序关系,万一是查其他状态呢,SQL不宜依赖于枚举的值,方案不通用 
- 这个SQL可读性差,可理解性差,可维护性差,强烈不推荐 
or/in/union与索引优化的更多相关文章
- MySQL的or/in/union与索引优化
		转载自:MySQL的or/in/union与索引优化 https://blog.csdn.net/zhangweiwei2020/article/details/80005590 假设订单业务表结构为 ... 
- 170505、MySQL的or/in/union与索引优化
		假设订单业务表结构为: order(oid, date, uid, status, money, time, …) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照da ... 
- MySQL的or/in/union与索引优化 | 架构师之路
		假设订单业务表结构为: order(oid, date, uid, status, money, time, …) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照da ... 
- SQL 查询优化 索引优化
		sql语句优化 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的 ... 
- Mysql 索引优化分析
		MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ... 
- 知识点:Mysql 数据库索引优化实战(4)
		知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ... 
- 知识点:Mysql 索引优化实战(3)
		知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ... 
- MySQL索引优化看这篇文章就够了!
		阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ... 
- 【mysql】索引优化记录
		基础知识 Innodb存储引擎 支持行锁 支持事务: Myisam存储引擎 只支持表锁: 不支持事务: 常见索引列表 独立的列 前缀索引(索引选择性) 多列索引(并不是多个单列索引,索引顺序很重要) ... 
随机推荐
- WPF 快速制作可拖拽的对象和窗体
			引用类库: 1.Microsoft.Expression.Interactions 2.System.Windows.Interactivity <Window x:Class="Wp ... 
- Idea Debug多线程不进断点问题处理
			Idea也会使我狼狈不堪,Eclipse下约定成俗,却非Idea的默认规则. 比如 DEBUG多个线程时,Idea的默认设定就会遇到断点不能进入的问题. 解决的方法: 点击DEBUF框下的双红点(Vi ... 
- 【转】jstat命令查看jvm的GC情况 (以Linux为例)
			[From]https://www.cnblogs.com/yjd_hycf_space/p/7755633.html jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: ... 
- Tor路径选择说明
			Tor Path Specification Roger Dingledine Nick Mathewson Note: This is an attempt to specify Tor as cu ... 
- linux下mysql设置主从
			一 主服务器修改 mysql的主从设置主要原理是 主数据库开启日志,并且创建从服务器专属账户,从服务器用该账户,读取到日志进行同步 准备两个mysql数据库(如何安装请查看,linux下mysql安 ... 
- app测试自动化操作方法之二
			3.进行APP的滑动操作 方法一:#获取窗口大小def get_size(): size=dr.get_window_size() return size print(get_size())#向上滑动 ... 
- 从STL文件到网格拓扑
			原文链接 STL文件是什么 STL文件是网格文件的一种格式,分为二进制和文本两种类型.具体来讲,它定义了一群三角面片,比如下面是一个文本的STL示例: solid geometryplusplus f ... 
- python 实例化 类方法 静态方法 成员变量 实例方法 等调用
			1.参考代码如下 # coding:utf-8 class student: # 成员变量 ok = None like = '八戒你瘦了' # 实例方法 def __init__(self): # ... 
- apache 设置允许跨域
			1.首先找到 httpd.conf 文件 找到 #LoadModule headers_module modules/mod_headers.so 把#注释符去掉(也有可能已经默认去掉了) 目的是 ... 
- swift MT报文解析处理
			swift 官方资料:https://www2.swift.com/knowledgecentre/publications/us5mc_20180720/2.0?topic=alec.htm#gen ... 
