MySQL的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可读性差,可理解性差,可维护性差,强烈不推荐
MySQL的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高级知识(六)——索引优化
前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...
- mysql千万级数据量根据索引优化查询速度
(一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...
- MySQL学习【第八篇索引优化】
一.建立索引的原则(规范) 1.选择唯一性索引 只要可以创建唯一性索引的,一律创建唯一索引(因为速度快呀) 判断是否能创建唯一索引,用count(列名),count(distinct(列名))一样就能 ...
- MySQL 高级 视图 事物 触发器 函数 索引优化
视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view t ...
- or/in/union与索引优化
假设订单业务表结构为: order(oid, date, uid, status, money, time, …) 其中: oid,订单ID,主键 date,下单日期,有普通索引,管理后台经常按照da ...
- mysql中的字符串类型数据索引优化
摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
随机推荐
- 浅谈href=与href=javascript_void(0)的区别
"#"包含了一个位置信息.默认的锚点是#top 也就是网页的顶端.而javascript:void(0) 仅仅表示一个死链接,这就是为什么有的时候页面很长,浏览链接明明是#可是跳 ...
- Leetcode 90.子集
子集 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...
- Leetcode 68.文本左右对齐
文本左右对齐 给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本. 你应该使用"贪心算法"来放置给定的单 ...
- CH上的Think Bear#1模拟赛
题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20%20Thinking%20Bear%20%231%20(NOIP%E6%A8 ...
- HashMap源码分析2:扩容
本文源码基于JDK1.8.0_45. final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; int oldCap = ...
- java实现WebService 以及客户端不同的调用方式
java 实现WebService 以及不同的调用方式 webservice: 就是应用程序之间跨语言的调用 wwww.webxml.com.cn 1.xml 2. ws ...
- eclipse编译项目用maven编译问题
1.eclipse只是个ide开发环境,并没有编译器功能.没有编译器.eclipse编译项目只是调jdk本地的java编译器.maven是单独编译,eclipse可以调用maven编译, 在eclip ...
- Unity3D Asset文件导出3DMax 可编辑格式
本文章由cartzhang编写,转载请注明出处. 全部权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/60878354 作者:car ...
- Openlayers3 计算地图上随意两点间的距离
相应的openlayers的版本号为3.7. 主要用的接口是ol.Sphere.haversineDistance([x1,y1],[x2,y2]): 4326坐标系中计算两点距离的方式为: var ...
- UIViewController 专题
呵呵 轻轻巧巧 UIViewController self setNeedsStatusBarAppearanceUpdate 刷新状态栏 (内部会重新调用 prefersStatusBarHi ...