mysql union 放弃索引_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 union 放弃索引_MySQL的or/in/union与索引优化相关推荐
- mysql 配置执行计划_MySQL深入学习(二)--配置、索引、执行计划
MySQL 一.MySQL 5.7 初始化配置 1.初始化数据并配置 # 1.初始化数据 /usr/local/mysql/bin/mysqld --initialize-insecure --use ...
- mysql explain 索引_MySql中Explain详解与索引最佳实践
使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理你的SQL语句的.分析你的查询语句或是结构的性能瓶颈 下面是使用 explain 的例子: 在 select 语句之 ...
- mysql字段简索引_MySQL常用的一些语句,索引,字段等
1.库相关: 建库: character set:指定编码 COLLATE:排序规则 utf8mb4_general_ci 大小写不敏感 CREATE DATABASE `test_db` defau ...
- mysql为什么用B 树做索引_mysql为什么用b+树做索引
关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...
- mysql创建联合索引_mysql如何创建多个联合索引
mysql创建多个联合索引的方法:可以使用CREATE INDEX或ALTER TABLE语句来创建.在创建联合索引时,应该仔细考虑列的顺序. MySQL中索引规则: 1.需要加索引的字段,要在whe ...
- mysql新增BTREE索引_mysql如何添加多个btree索引
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构. 1.B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度值不超过1,而且同层级的节点间有指针相互链接 2.在B+树 ...
- mysql只能用一个索引_mysql只会使用到一个索引的原因
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar' 其中column1,colu ...
- mysql 分页查询分析_mysql 大表分页查询测试分析优化
http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/kupig/archive/2011/10/19 ...
- mysql group 更新递增_MySQL Group Replication在网易使用和优化实践
本文由作者授权网易云发布,未经许可,请勿转载 作者:温正湖,网易数据库技术专家 MGR(MySQL Group Replication)是MySQL官方推出的领先的服务高可用和数据高可靠方案,网易从2 ...
最新文章
- Python的包管理工具Pip
- cocos2d-x 关于tilemap滚动时黑线闪动的问题
- 爱尔兰圣三一学院计算机全球排名,QS世界大学学科排名,爱尔兰圣三一学院20个学科进世界百强...
- 【漫画详解】用iframe障眼法,骗取用户点击
- Linux日志服务器的搭建
- windows下git安装
- 雪球产品定价-蒙特卡罗模拟法
- ECharts绘制中国地图、广西地图
- 思岚激光雷达+cartographer建图
- react-antd table树形数据默认展开行实现以及自定义图标实现及踩坑(defaultExpandedRowKeys,expandedRowKeys)
- python分析方向的第三方库_Python 机器学习方向的第三方库是
- SQL-查询最后一条数据
- LINUX定时清理文件定时任务
- yocto编译错误- Error executing a python function in exec_python_func() autogenerated
- B站 x《男人装》首次破圈合作,有趣的灵魂遇见了艺术
- c oracle帮助文档下载,Oracle 19c 官方文档——Concepts
- 苏宁的人工智能创新应用,看AI和商务的激烈碰撞
- 服务器pci-e硬盘,PCI-E固态硬盘在客户端的机会_希捷硬盘_服务器评测与技术-中关村在线...
- java如何把汉字转拼音
- 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
热门文章
- php mongodb 别名,PHP mongo与mongodb扩展 | 码路春哥
- linux怎么知道ping命令,教程方法;通过ping命令查看服务器类型(linux还是windows系列)电脑技巧-琪琪词资源网...
- C语言学习之输入4个整数,要求按由小到大的顺序输出。
- java面试题解惑_JAVA面试题解惑系列(五)——传了值还是传了引用?
- 约瑟夫环的数学优化方法
- MongoDB 索引-9
- spring注解方式 idea报could not autowire
- 来首都初次就医的感受
- 在ubuntu 14.04 编译android 2.3.1 错误解决办法
- 【vbs】vbs写ini文件