mysqlor得优化_MySqlor语句的索引优化
最近看书《⾼性能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。
下⾯,⽬前我发现这个并不会像书中描述的那样。
MySql 版本号
sql中union多表合并
表结构-索引-查询语句
第⼀张图是数据库的版本,8.0.13,数据库引擎 InnoDB
在最后explain 语句中,可以看到type =all,所以即使创建了两个单列索引,依然是全表扫描。
下⾯我将展⽰优化流程。
1. 使⽤union ,
使⽤union,union 会⾃动做数据去重,但是在此过程中会建⽴临时表,最后返回的是临时表的合并的结果,在最后⼀次查询中也是⼀个全表扫描
使⽤union的查询
2. 使⽤union all
使⽤union all, union all 是直接合并数据集,并不会做去重操作,减少了⼀次合并操作,可以看到其中并没有涉及到临时表
使⽤ union all 操作
经过以上实验,可以看出mysql 在遇到or的多列查询时,即使每⼀列都建⽴了单独索引,也并不会⾃动优化SQL。所以建议不要使⽤or,避免全表扫描。⽽使⽤union时,由于数据库需要帮忙进⾏数据去重,其实是会进⾏3次数据操作,远⽐不上使⽤union all 时,只会进⾏两次数据操作。
结论:进⾏多个条件并集查询时,不要使⽤or, 不要寄希望于数据库的优化,⽽应该使⽤union all 或in 等语句优化SQL

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。