90928yao
V2EX  ›  程序员

mysql join 的执行顺序

By 90928yao at 2019 年 11 月 28 日 · 3709 次点击

网上文章都是说先 join 下然后对 join 后的笛卡尔积进行 where

但是 a join b on a.id = b.id where a.age <10 ( inner join 或者 left join )

万一 a b 是个大表

先进行笛卡尔积多耗时,为什么不先执行 where 过滤 a 表中的数据呢

12 条回复  •  2020-10-31 16:20:51 +08:00
F281M6Dh8DXpD1g2
   1
F281M6Dh8DXpD1g2  
   2019 年 11 月 28 日
你先搞明白 mysql 的 query 是怎么执行的
kifile
   2
kifile  
   2019 年 11 月 28 日
这个涉及到一些条件下推的优化了,目前的大数据计算的类 sql 引擎应该都有做,mysql 就不清楚了
90928yao
   3
90928yao  
OP
   2019 年 11 月 28 日
@liprais 大佬能稍微讲下吗
findmyself
   4
findmyself  
   2019 年 11 月 28 日
先问是不是 再问为什么
daozhihun
   5
daozhihun  
   2019 年 11 月 28 日
@kifile 我们之前给 sql server 做优化的时候,有一种优化策略就是先过滤再 join,印象中把 30s 的报表查询能优化到 5s 以内。
当然大多数情况建好合理的索引然后交给引擎自己判断就好了,到有性能问题的时候再分析执行计划针对性的优化
reus
   6
reus  
   2019 年 11 月 28 日   ❤️ 2
执行引擎会分析并优化,“网上文章”说的不一定对,可能某个旧版的 mysql 的执行引擎很傻,被作者当作不变的真理了。
官方文档就有这些内容: https://dev.mysql.com/doc/refman/8.0/en/execution-plan-information.html
不要总是看一些二手文章,过时文章,或者别人转述的二手知识。
ewq
   7
ewq  
   2019 年 11 月 28 日
mysql5.6 开始支持 ICP 优化
lihongjie0209
   8
lihongjie0209  
   2019 年 11 月 28 日
数据库系统实现 第 5 章 5.2 节

CStarter
   9
CStarter  
   2019 年 11 月 28 日 via Android
楼主了解一下 join 和 straight_join 的区别
xe2vherd
   10
xe2vherd  
   2019 年 11 月 28 日
楼主估计不是科班出身
kifile
   11
kifile  
   2019 年 11 月 28 日
自己 Explain 一下,看看执行计划不是就挺明白了的吗?
GroupF
   12
GroupF  
   2020 年 10 月 31 日
谨记,独立思考
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 40ms · 3.9.8.5