千家信息网

MySQL中or、in、union与索引优化详析

发表于:2024-10-26 作者:千家信息网编辑
千家信息网最后更新 2024年10月26日,本文缘起自《一分钟了解索引技巧》的作业题。假设订单业务表结构为:order(oid, date, uid, status, money, time, …)其中:oid,订单ID,主键date,下单日期
千家信息网最后更新 2024年10月26日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安全错误 数据库的锁怎样保障安全 服务器桌面不显示驱动 辅导员理论宣讲网络安全观 自主软件开发即征即退 车联网v2x软件开发 以网络安全为主题的议论文题目 嘉定区电话数据库价格表格 lol手游皮肤数据库 安卓手机软件开发难吗 厦门凌众互联网科技有限公司 黑暗之魂3服务器断开怎么解决 维云网络技术有限公司怎么样 海南万稷网络技术有限公司游戏 java软件开发中专 网站换数据库 网络安全法明确网络运营者义务 dota2 服务器ip 为什么网络安全概念股票这么高 网络安全是电子商务安全的基础 数据库并发程序设计 网络安全与信息技术的作文 魔兽 大服务器 湖北省税务局安全接入服务器地址 以网络安全为主题的议论文题目 适合于软件开发得笔记本 全市信息平台服务器故障 王珊数据库 网络安全警种成立 软件开发中哪里最容易出错 服务器主板兼容普通机箱吗 DNS服务器和MAC地址
0