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