MySQL 的 inner join 顺序是否会影响最后查询的性能

2022-08-02 22:12:57 +08:00
 857681664

假设有表 a ( 100 条)表 b ( 50 条) 然后是以下 2 条 sql 语句

select *
from a
inner join b
---
select *
from b
inner join a

对于上面 2 条 sql,最后执行的速度会有区别吗?我记得 MySQL 的 join 是 nested loop 实现的,个人感觉应该没有什么区别吧。

1952 次点击
所在节点    程序员
12 条回复
liprais
2022-08-02 22:36:51 +08:00
不会
7911364440
2022-08-03 11:43:19 +08:00
用小表做驱动表可以减少被驱动表的访问次数,没有其他过滤条件的话还是 b 做驱动表好些
zed1018
2022-08-03 12:02:23 +08:00
8 以后有 hash join
enjoychen0318
2022-08-03 13:07:24 +08:00
上面的两种写法,mysql 好像都会帮你优化成小表驱动大表的
enjoychen0318
2022-08-03 13:11:29 +08:00
驱动表对执行速度的影响可以看丁奇《 mysql45 讲》的第 34 讲
iXInbo
2022-08-03 13:27:01 +08:00
主要是小表驱动大表,如果反了可能会影响性能
lazyfighter
2022-08-03 16:00:39 +08:00
我觉得 mysql 没必要设计的这么 low ,优化器应该会优化的
JaguarJack
2022-08-03 16:18:21 +08:00
优化器回优化的,不用管
857681664
2022-08-03 22:41:24 +08:00
@enjoychen0318
@7911364440
@iXInbo
如果单纯是 inner join 的话,感觉驱动表大小不会影响最后的结果吧,nested loop join 下,外面 for50 次,里面 for100 次跟外面 for100 次,里面 for50 次在 cpu 运算上好像没有区别,在数据量比较小的例子下,io 层面也是一样的消耗
iPisces77
2022-08-04 00:48:14 +08:00
优化器会优化,但还是要查一下执行计划
iseki
2022-08-04 08:15:24 +08:00
现在数据库基本都是 CBO 的,查执行计划吧,猜有点困难呐
iXInbo
2022-08-05 14:37:06 +08:00
一般这种优化都是次数上去了才会有明显的变化;比如外面 5000 次和 1000 次的对比,甚至几万几千万,
可能原本几毫秒的差距会被放大成几秒和几十秒;

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

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

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

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

© 2021 V2EX