mysql join 的执行顺序

2019-11-28 10:21:45 +08:00
 90928yao

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

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

万一 a b 是个大表

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

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

CStarter
2019-11-28 12:22:20 +08:00
楼主了解一下 join 和 straight_join 的区别
zmxnv123
2019-11-28 12:45:17 +08:00
楼主估计不是科班出身
kifile
2019-11-28 13:13:42 +08:00
自己 Explain 一下,看看执行计划不是就挺明白了的吗?
GroupF
2020-10-31 16:20:51 +08:00
谨记,独立思考

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/623858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX