
假设有表 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 F281M6Dh8DXpD1g2 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 akagishigeru 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 次的对比,甚至几万几千万, 可能原本几毫秒的差距会被放大成几秒和几十秒; |