本文缘起自《一分钟了解索引技巧》的作业题。

假设订单业务表结构为:

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 union 放弃索引_MySQL的or/in/union与索引优化相关推荐

  1. mysql 配置执行计划_MySQL深入学习(二)--配置、索引、执行计划

    MySQL 一.MySQL 5.7 初始化配置 1.初始化数据并配置 # 1.初始化数据 /usr/local/mysql/bin/mysqld --initialize-insecure --use ...

  2. mysql explain 索引_MySql中Explain详解与索引最佳实践

    使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...

  3. mysql字段简索引_MySQL常用的一些语句,索引,字段等

    1.库相关: 建库: character set:指定编码 COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感 CREATE DATABASE `test_db` defau ...

  4. mysql为什么用B 树做索引_mysql为什么用b+树做索引

    关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...

  5. mysql创建联合索引_mysql如何创建多个联合索引

    mysql创建多个联合索引的方法:可以使用CREATE INDEX或ALTER TABLE语句来创建.在创建联合索引时,应该仔细考虑列的顺序. MySQL中索引规则: 1.需要加索引的字段,要在whe ...

  6. mysql新增BTREE索引_mysql如何添加多个btree索引

    目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 1.B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度值不超过1,而且同层级的节点间有指针相互链接 2.在B+树 ...

  7. mysql只能用一个索引_mysql只会使用到一个索引的原因

    select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar' 其中column1,colu ...

  8. mysql 分页查询分析_mysql 大表分页查询测试分析优化

    http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/kupig/archive/2011/10/19 ...

  9. mysql group 更新递增_MySQL Group Replication在网易使用和优化实践

    本文由作者授权网易云发布,未经许可,请勿转载 作者:温正湖,网易数据库技术专家 MGR(MySQL Group Replication)是MySQL官方推出的领先的服务高可用和数据高可靠方案,网易从2 ...

最新文章

  1. Python的包管理工具Pip
  2. cocos2d-x 关于tilemap滚动时黑线闪动的问题
  3. 爱尔兰圣三一学院计算机全球排名,QS世界大学学科排名,爱尔兰圣三一学院20个学科进世界百强...
  4. 【漫画详解】用iframe障眼法,骗取用户点击
  5. Linux日志服务器的搭建
  6. windows下git安装
  7. 雪球产品定价-蒙特卡罗模拟法
  8. ECharts绘制中国地图、广西地图
  9. 思岚激光雷达+cartographer建图
  10. react-antd table树形数据默认展开行实现以及自定义图标实现及踩坑(defaultExpandedRowKeys,expandedRowKeys)
  11. python分析方向的第三方库_Python 机器学习方向的第三方库是
  12. SQL-查询最后一条数据
  13. LINUX定时清理文件定时任务
  14. yocto编译错误- Error executing a python function in exec_python_func() autogenerated
  15. B站 x《男人装》首次破圈合作,有趣的灵魂遇见了艺术
  16. c oracle帮助文档下载,Oracle 19c 官方文档——Concepts
  17. 苏宁的人工智能创新应用,看AI和商务的激烈碰撞
  18. 服务器pci-e硬盘,PCI-E固态硬盘在客户端的机会_希捷硬盘_服务器评测与技术-中关村在线...
  19. java如何把汉字转拼音
  20. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

热门文章

  1. php mongodb 别名,PHP mongo与mongodb扩展 | 码路春哥
  2. linux怎么知道ping命令,教程方法;通过ping命令查看服务器类型(linux还是windows系列)电脑技巧-琪琪词资源网...
  3. C语言学习之输入4个整数,要求按由小到大的顺序输出。
  4. java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用?
  5. 约瑟夫环的数学优化方法
  6. MongoDB 索引-9
  7. spring注解方式 idea报could not autowire
  8. 来首都初次就医的感受
  9. 在ubuntu 14.04 编译android 2.3.1 错误解决办法
  10. 【vbs】vbs写ini文件