mysql or 得优化_MySql or语句的索引优化

最近看书《高性能MySql》,5.3.3 节中介绍在MySql 5.0和更新的版本中,`select name , hobby from user where name=1 or  hobby = 1;` 这个语句如果 name 和 user 都建立了单独的索引,查询能够同时使用着两个单列索引,并将结果合并。 explain sql 的结果中type 为index_merge。

下面,目前我发现这个并不会像书中描述的那样。

d2885d63a8fe

MySql 版本号

d2885d63a8fe

表结构-索引-查询语句

第一张图是数据库的版本,8.0.13,数据库引擎 InnoDB

在最后explain 语句中,可以看到type =all,所以即使创建了两个单列索引,依然是全表扫描。

下面我将展示优化流程。

1. 使用union ,

使用union,union 会自动做数据去重,但是在此过程中会建立临时表,最后返回的是临时表的合并的结果,在最后一次查询中也是一个全表扫描

d2885d63a8fe

使用union的查询

2. 使用union all

使用union all, union all 是直接合并数据集,并不会做去重操作,减少了一次合并操作,可以看到其中并没有涉及到临时表

d2885d63a8fe

使用 union all 操作

经过以上实验,可以看出mysql 在遇到or的多列查询时,即使每一列都建立了单独索引,也并不会自动优化SQL。所以建议不要使用or,避免全表扫描。而使用union时,由于数据库需要帮忙进行数据去重,其实是会进行3次数据操作,远比不上使用union all 时,只会进行两次数据操作。

结论:进行多个条件并集查询时,不要使用or, 不要寄希望于数据库的优化,而应该使用union all 或in 等语句优化SQL

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值