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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,264评论 0 7
  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,906评论 0 10
  • 50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna...
    最美的太阳WW阅读 3,280评论 0 23
  • 最近生活上有些不如意,心境也越来越糟,特别需要有人来开导下。以前参悟过一些佛学,希望找本佛学类书籍开导下自...
    渡缘阅读 580评论 0 0
  • 我们把地球当成是我们全部的世界,那么我们全部的梦想也就只能寄托在这地球上,现实,人类就把地球当成是一个角斗的场地,...
    力牧阅读 263评论 0 1