首页 > 数据库 >MySQL的or/in/union与索引优化

MySQL的or/in/union与索引优化

时间:2022-12-05 11:34:13浏览次数:44  
标签:status union 索引 MySQL where order select


假设订单业务表结构为:
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可读性差,可理解性差,可维护性差,强烈不推荐

标签:status,union,索引,MySQL,where,order,select
From: https://blog.51cto.com/u_14230175/5911659

相关文章

  • MySQL统计一个列中不同值的数量
    ​​https://yiqiwuliao.com/post/mysql/mysqltong-ji-yi-ge-lie-zhong-bu-tong-zhi-de-shu-liang​​​mySQL统计一个列中不同值的数量这个需求其......
  • MYSQL 的审计日志插件
    MYSQL的审计日志插件,可惜目前只是LINUX用:来自McAfee的MySQL插件,为MySQL提供审计功能,重点是安全性和审计要求。该插件可以用作独立的审核解决方案,也......
  • mysql 5.7中关于count(*)的优化
    在mysql5.7中,对于selectcount(*)fromtable的优化,可以设置为:selectcount(*)fromtablewhereuid>0其中uid为辅助索引,辅助索引不存放数据......
  • mysql版本区别及版本号解释
    mysql版本区别及版本号解释1.mysql类型mysqlcommunityserver,社区免费版,但没有技术支持mysqlenterprise,企业收费版mysqlcluster,主要用于服务器集群mysqlworkbench,用来......
  • (译)MySQL中的直方图统计信息
    什么是直方图,在MySQL8.0.3如何创建直方图?MySQL的直方图是如何影响执行计划生成的?创建直方图有哪些注意事项?直方图和索引对优化器的选择上有什么差异,又该如何选择?如何判断......
  • mysql中的case语句
    1。selectname,casewhenbirthday<'1981'then'old'whenbirthday>'1988'then'yong'else'ok'ENDYORNfromlee;2。selectNA......
  • MySQL记录用户操作日志
    MySQL记录用户操作日志有时,我们想追踪某个数据库操作记录,如想找出是谁操作了某个表(比如谁将字段名改了)。二进制日志记录了操作记录,线程号等信息,但是却没有记录用户信息,因此......
  • Navicat中MySQL命令列界面操作及基础常用命令
    https://blog.csdn.net/weixin_71712767/article/details/126863842如何使用navicat进入MySQL命令行界面?如何通过命令对数据库/表进行操作? 如何在Navicat中MySQL链接打......
  • 连接mysql报错 errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of ma
    https://copyfuture.com/blogs-details/202206101947537199错误原因:mysql设定了单个客户端最大连接失败次数,超过后便无法再连接成功.可命令行查看:最大失败数为100.......
  • CentOS7.0下完美部署Solr 搜索引擎
    一、环境准备:系统环境:CentOS-7.0.1406       tomcat-7.0.29       jdk-7u9       solr-4.7.0首先将软件包上传到/tmp目录下1、 jdk安装[ro......