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