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