sql优化--OR

尽可能避免使用“OR”去查询,特别是left join的对象
例如:

select a.* from a
left join b on b.id=a.b_id
where a.xx>=100 or b.yy>=100

《sql优化--OR》 explain plan

这种sql解析到数据库先会有全表的left join(开销最大),然后再去跟进两个条件去检索,就算是几个命中索引的条件,只要主表(a)数据一多,性能就会直线下降

其实这种sql的主要目的查询两个不在一张表内数据的‘或’关系,也就是

  1. select * from a where a.xx>=100
  2. select a.* from a left join b on b.id=a.b_id where b.yy>=100

这两条sql单独执行毋庸置疑 只要命中索引,效率都会很快
第二条sql的left join由于后面有查询b的条件其实等同于inner join,等于都是命中索引的查询,等于先经过索引的筛选再join,大大节省了开支

所以这种sql可以直接union起来就实现了我们需要的结果

select a.* from a where a.xx>=100
union all
select a.* from a left join b on b.id=a.b_id where b.yy>=100

    原文作者:夏_至
    原文地址: https://www.jianshu.com/p/61598a1f5f95
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞