假设订单业务表结构为:
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与索引优化相关推荐

  1. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc ...

  2. mysql千万级数据量根据索引优化查询速度

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

  3. MySQL高级- group by ,order by 索引优化

    一:索引失效 1. 2.最佳左前缀法则 4. 8. 使用覆盖索引解决这个问题. 二.索引优化 1.ORDER BY 子句,尽量使用Index方式排序,避免使用FileSort方式排序 MySQL支持两 ...

  4. MySQL高级知识(六)——索引优化

    前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...

  5. sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

  6. mysql union 放弃索引_MySQL的or/in/union与索引优化

    本文缘起自<一分钟了解索引技巧>的作业题. 假设订单业务表结构为: order(oid, date, uid, status, money, time, -) 其中: oid,订单ID,主 ...

  7. 《MySQL高级篇》八、索引优化与查询优化

    文章目录 1. 数据准备 2. 索引失效案例 2.1 全值匹配我最爱 2.2 最左匹配原则 2.3 主键插入顺序 2.4 计算.函数.类型转换(自动或手动)导致索引失效 2.5 范围条件右边的列索引失 ...

  8. 3、mysql索引优化一:Explain关键字分析

    作为一个Java开发,在我们日常工作中,对于mysql的使用中涉及最多的恐怕就是写SQL了,一定遇到过sql执行慢的问题,那么SQL优化工作就显得格外重要.有了对mysql执行过程以及索引实现原理了解 ...

  9. mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

最新文章

  1. GPU运行Tensorflow详细教程及错误解决
  2. JS基础知识学习(一)
  3. Loki 2.0.0 发布,ELK之外的优秀日志聚合系统!
  4. GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
  5. Save the Room【找规律】
  6. 实用常识 | 巧妙使用IA图片助手多地址提取批量下载(老白嫖怪了)
  7. protobuf 安装_Beego 安装时 一直无响应(443)怎么办
  8. datalist 给输入框绑定文本提示(大部分浏览器不支持)
  9. ubuntu20 scrt 连接ssh报错的解决方法
  10. .Net .Net Core 下使用FastDFS 文件上传下载
  11. android指纹测试,Android指纹识别
  12. VCL界面控件DevExpress VCL发布v18.1.7|附下载
  13. Flask入门flask-script 蓝本 钩子函数(3)
  14. 如何区分自己mac电脑的CUP型号
  15. Minecraft 1.16.5模组开发(三十) 自定义成就系统(advancements)
  16. 【已解决】程序异常终止:Process finished with exit code -1073741819 (0xC0000005)
  17. WinInet + MFC 写vc驿站助手
  18. java.awt包_java.awt包 简介
  19. JAVA使用JNA技术获取键盘输入
  20. java 桌面客户端开发

热门文章

  1. [51nod1847][算法马拉松23(飞越愚人节)F]奇怪的数学题
  2. 重载-运算符(感觉怪怪的)
  3. C++中IDispatch接口
  4. C++ 虚函数与纯虚函数
  5. Inno Setup 5制作安装程序
  6. 新来的妹纸问我 AJAX 请求为什么不安全?没有回答出来。。。
  7. 全面解析 Netflix 的微服务架构设计
  8. SVT-AV1:开源编解码最新进展
  9. Netflix如何通过重构视频Gatekeeper提升内容运营效率?
  10. LiveVideoStackCon讲师热身分享 ( 三 ) —— Facebook的工具文化与多媒体QoE