MySQL中or、in、union与索引优化详析
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本文缘起自《一分钟了解索引技巧》的作业题。假设订单业务表结构为:order(oid, date, uid, status, money, time, …)其中:oid,订单ID,主键date,下单日期
千家信息网最后更新 2025年01月24日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安全错误
数据库的锁怎样保障安全
数据库超市管理系统概述
ftp服务器的功能是什么
django测试数据库
怎么购买服务器阿里云
网络安全伪装攻击
广州触点互联网科技有限
软件开发的开发阶段的任务
上海综合软件开发批发价格
金仓数据库怎么删除用户
怒火一刀通用服务器下载
网络安全文明上网心得800字
领途互联网北京科技有限公司
服务器开机按键图解
网络安全硬件哪种好
如何查看服务器ssh地址
上海市计算机软件开发中心闵行
服务器上找不到打印机
根域名服务器的基本情况
网络技术支撑要下乡吗
公网IP的路由器可以当服务器
c 实现数据库增删改查
数据库物理模型的设计概念
皮卡堂守护甜心服务器
coc 分服务器
saas云服务器管理
余姚一站式软件开发商
dna数据库建设培训
服务器时出现问题是怎么回事
从事金融软件开发 csdn
浦东新区数据软件开发报价表