mysql join
一般说join时 小表放左边,大表放右边。就是小表作为驱动表。
网上找到了另一种说法:对于nested loops join和hash join来说,小的结果集先访问,大的结果集后访问(即与表的大小没有关系,与具体sql返回的结果集大小有关);而对于merge sort join 来说,先访问谁效率都是一样的。
如用户表(10条记录),用户帖子表(100表记录),也就是每个用户发了10条。用用户id关联,查看用户所有帖子。以用户表为左表,作为驱动表。
1.没有索引的情况下。就是遍历用户表,根据user_id与去帖子表去找这个用户发的帖子,找到了则返回。如果不管数据库,用程序来实现两个数组合并我们会怎么做?
result = [];
user = [10];
post= [100];
for(i = 0; i<10; i++)
      for(j=0;j<100;j++)
           if(user[i].id=post[j].user_id) result.push(user[i],post[j]) 将两条记录合并,存入数组
很明显,复杂度为 10*100,一般记为o(n^2);所以此时,把左右表顺序换下变成
for(j=0; j<100; j++)
     for(i=0; i< 10; i++)
发现变成 100*10,完全一样,也操作了1000次。所以在没有索引情况下,左右顺序不影响性能。
2.只有两个都有索引了,才会有影响。遍历10个user,取用户id为1的去右表里找,有索引,只要10次就找到了这用户的10个帖子,
这样操作次数为 用户表记录数*每个用户发的帖子数=10*10=100次。
但反过来操作,就是用户帖子数*用户数 =100*10=1000次。
其实很多问题都是常识问题,只是很多人没去思考原因,像这种问题小朋友应该都会懂的,并没有什么高级的。

Comments are closed.

Post Navigation