请教 left join 的效率问题

2018-10-11 14:12:40 +08:00
 lusirui

查询 1

select a.*,b.* left join b on a.id=b.id where a.go=2 limit 10

查询 2

select a.*,b.* from (select * from a where a.go=2 limit 10) as a left join b on a.id=b.id

请问,在表 a 数据量非常大的情况,把查询 1 改成查询 2 会提升查询效率么。 也就是先通过子查询查出 a 的数据,再进行联查,会比一条联查快么。

4107 次点击
所在节点    MySQL
14 条回复
TommyLemon
2018-10-11 14:51:02 +08:00
查询 1 的 from 是 form a ?
```sql
select a.*,b.* left join b on a.id=b.id where a.go=2 limit 10
```
fffflyfish
2018-10-11 15:00:13 +08:00
当然会快了,从原来的大表 join 变成小表 join,某种程度上避免了数据倾斜
akira
2018-10-11 15:08:34 +08:00
会。 这种问题,你分别对这 2 条 sql 做下 explain,就能看到区别的了
lusirui
2018-10-11 15:25:02 +08:00
@TommyLemon 哦,对,是 from a,我忘写了
TommyLemon
2018-10-11 15:28:20 +08:00
EXPLIAN 给出的执行过程是不一样的,第二个多了一个临时表的 SELECT,所以快不快和数据量有关
carlclone
2018-10-11 15:28:41 +08:00
正确做法不是给 on 右边的字段加索引么
TommyLemon
2018-10-11 15:29:53 +08:00
@TommyLemon 最好还是自己在生产环境排除干扰后多次反复试验,哪个快用哪个
TommyLemon
2018-10-11 15:34:06 +08:00
@TommyLemon
既然 a 表很大,可以拆分 SQL,在应用层 JOIN:
```sql
select * from a where a.go=2 limit 10
```
取出 a 的所有 id: [1,2,3...],然后:
```sql
select * from b where id IN(1,2,3...)
```
lusirui
2018-10-11 15:34:29 +08:00
@carlclone on 右边索引时有的,查询 1 和查询 2 都一样
lusirui
2018-10-11 15:43:15 +08:00
@TommyLemon 好的,谢谢,我也是看了 explain,没看出什么区别,而且查询 2 比查询 1 确实多一条 derived 的查询
dbolo123
2018-10-11 19:57:34 +08:00
能贴下 explain 吗
mmdsun
2018-10-16 22:50:23 +08:00
@TommyLemon 这样拼 SQL。会有长度限制吧
TommyLemon
2018-10-17 09:38:33 +08:00
@mmdsun id 在 1w 个以上可能会导致缓冲区溢出,这时就需要分批处理了
isrfr
2019-03-25 17:21:44 +08:00
limit 放里面?

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

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

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

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

© 2021 V2EX