同样两张表join,结果也都是三百万量级的,但是为什么A j B 就是10s,B j C就是0.7s呢?
select count() from A join B on A.id = B.aId;
select count() from B join C on B.pId = C.pId;
后面explain 发现他们的rows差别很大,一个是2852831,1;另一个是4613,884;
所以原因应该就是A- B是一一对应的,表的大小都是三百万,而B- C是多对一关系,C的量级只有5000,所以join起来快很多。核心问题还是join的表大小不同,难怪那么奇怪同样是join差别这么大。
select count() from A join B on A.id = B.aId join C on B.pId = C.pId;
这玩意就非常慢,所以根据where条件来决定优化,如果没有需要用到B、C表的where条件,那么由于上述的对应关系,我只需要使用select count() from A (+where xx) 就可以得到结果,这样显然很快,如果有用到B、C表的where条件,那么才全部join起来计算,这时候由于有where筛选所以也会达到可以接受的速度。