MySQL中or、in、union与索引优化详析
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本文缘起自《一分钟了解索引技巧》的作业题。假设订单业务表结构为:order(oid, date, uid, status, money, time, …)其中:oid,订单ID,主键date,下单日期
千家信息网最后更新 2025年11月07日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=0union allselect * 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 descselect * from order where status=0 or date <= CURDATE()
注:此为示例,别较真SQL对应业务的合理性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
索引
查询
订单
状态
方案
业务
普通
例子
建议
程序
程序员
内容
后台
用户
作业
学习
管理
肯定
最低
频繁
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
第六届深圳市网络安全宣传周开启
中国癌症数据库
上海上门网络技术信息推荐
你们的服务器不会在乌克兰吧
湛江微信软件开发定制
大流量服务器伪造ip
就网络安全提出看法
神州软件开发电脑配置要求
吉利软件开发部是外包公司吗
三个月如何快速学习网络技术
郑州网络安全馆观后感
网络安全犯罪举报网站
了解网络安全事件
将数据库数据传入jsp
软件开发 众包
青县手机软件开发
数据库基础与应用观后感
网络安全 表情包
杭州创年网络技术
服务器2019系统好用吗
android数据库在哪
上海上门网络技术信息推荐
x86服务器2018
自组织网络技术安全问题
网络安全 应急措施
数据库日志无法打开
我局成立了网络安全领导机构
锐捷网络技术怎么样
php登录系统一定要数据库么
数据库基础与应用观后感