MySQL distinct 子查询的一个疑问

vvtf 发布于 2016/01/15 13:07
阅读 330
收藏 0

我有一条这样的sql,用到了子查询,因为a表数据比较大。

select count(a.id) from a join (select uid from b) c on a.id=c.uid;

但是这样的效率非常慢,使用了10多秒。

然后使用explain查看mysql解释后的sql。

然后它拆成了:

select count(a.id) from a join b where a.id=b.id;

居然没用了子查询,所以效率慢了很多。


然后我们改成这样

select count(a.id) from a join (select distinct uid from b) c on a.id=c.uid;


这时用了不到1秒钟就返回了结果。

然后,explain,解释后发现是用了子查询。

请问,这是怎样的原因造成的?

还有请问如何使用子查询,就像我写的sql一样,不distinct。

mySQL版本:5.7.10


表:

无数据:



无distinct:



distinct:




加载中
0
pleatu
pleatu
这个速度快,不是因为用了子查询,应该是b表uid重复值很多,distinct后结果集很小,join很快。
pleatu
pleatu
回复 @NamoAmitabha : 好奇怪啊,这么试试: select count(a.id) from a join (select uid from b where 1=1) c on a.id=c.uid; 按理说,nested loop join,数据大的话效率会稍低的
vvtf
vvtf
这个问题我专门测试了一下,在b有重复uid,比如3000条(包含重复的),查询10秒。 这时,增加b的uid数据到6000条(包含重复),查询23秒。 但是用了distinct,这是uid为5000条(不包含重复),这时只需要不到1秒。
0
mark35
mark35
两条SQL的结果是一样的么
vvtf
vvtf
结果是一样的
返回顶部
顶部