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可读性差,可理解性差,可维护性差,强烈不推荐
六、作业
这样的查询能够命中索引么?
select * from order where uid in (
select uid from order where status=0
)
select * from order where status in (0, 1) order by date desc
select * from order where status=0 or date <= CURDATE()
注:此为示例,别较真SQL对应业务的合理性。
MySQL的or/in/union与索引优化相关推荐
- mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法
创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc ...
- mysql千万级数据量根据索引优化查询速度
(一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...
- MySQL高级- group by ,order by 索引优化
一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...
- MySQL高级知识(六)——索引优化
前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...
- sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)
一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...
- mysql union 放弃索引_MySQL的or/in/union与索引优化
本文缘起自<一分钟了解索引技巧>的作业题. 假设订单业务表结构为: order(oid, date, uid, status, money, time, -) 其中: oid,订单ID,主 ...
- 《MySQL高级篇》八、索引优化与查询优化
文章目录 1. 数据准备 2. 索引失效案例 2.1 全值匹配我最爱 2.2 最左匹配原则 2.3 主键插入顺序 2.4 计算.函数.类型转换(自动或手动)导致索引失效 2.5 范围条件右边的列索引失 ...
- 3、mysql索引优化一:Explain关键字分析
作为一个Java开发,在我们日常工作中,对于mysql的使用中涉及最多的恐怕就是写SQL了,一定遇到过sql执行慢的问题,那么SQL优化工作就显得格外重要.有了对mysql执行过程以及索引实现原理了解 ...
- mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书
MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...
最新文章
- GPU运行Tensorflow详细教程及错误解决
- JS基础知识学习(一)
- Loki 2.0.0 发布,ELK之外的优秀日志聚合系统!
- GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
- Save the Room【找规律】
- 实用常识 | 巧妙使用IA图片助手多地址提取批量下载(老白嫖怪了)
- protobuf 安装_Beego 安装时 一直无响应(443)怎么办
- datalist 给输入框绑定文本提示(大部分浏览器不支持)
- ubuntu20 scrt 连接ssh报错的解决方法
- .Net .Net Core 下使用FastDFS 文件上传下载
- android指纹测试,Android指纹识别
- VCL界面控件DevExpress VCL发布v18.1.7|附下载
- Flask入门flask-script 蓝本 钩子函数(3)
- 如何区分自己mac电脑的CUP型号
- Minecraft 1.16.5模组开发(三十) 自定义成就系统(advancements)
- 【已解决】程序异常终止:Process finished with exit code -1073741819 (0xC0000005)
- WinInet + MFC 写vc驿站助手
- java.awt包_java.awt包 简介
- JAVA使用JNA技术获取键盘输入
- java 桌面客户端开发
热门文章
- [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
- 重载-运算符(感觉怪怪的)
- C++中IDispatch接口
- C++ 虚函数与纯虚函数
- Inno Setup 5制作安装程序
- 新来的妹纸问我 AJAX 请求为什么不安全?没有回答出来。。。
- 全面解析 Netflix 的微服务架构设计
- SVT-AV1:开源编解码最新进展
- Netflix如何通过重构视频Gatekeeper提升内容运营效率?
- LiveVideoStackCon讲师热身分享 ( 三 ) —— Facebook的工具文化与多媒体QoE