Tonfay的gravatar头像
Tonfay 2015-04-28 16:14:21

数据库关联查询数据量大的地方做主表?还是数据量小的表做主表?哪一个效率更高呢?

数据库关联查询,(例如 left join)
数据量大的地方做主表?还是数据量小的表做主表?哪一个效率更高呢? 请说明!

例:

A表中有1000万条数据,B表中有1万条数据.
select * from A where id in (select id from B);
select * from B where id in (select id from A);

-------------------------------------------------------

select * from A left join B on A.id = B.id;
select * from B left join A on B.id = A.id;

-------------------------------------------------------

select * from A as AA,B as BB where AA.id = BB.id

-------------------------------------------------------

所有回答列表(7)
遇见,的gravatar头像
遇见,  LV36 2015年4月28日

少的做主表   

详细请看SQL 优化原则
java-main的gravatar头像
java-main  LV4 2015年4月28日

我用mysql 刚才试了一下.我现在是 大表有5W数据 小表有1.5W数据(两个表都没有做索引)

select * from A left join B on A.id = B.id;

查询差不多花费了50秒

 

select * from B left join A on A.id = B.id;

这种2秒

 

select * from A where id in (select id from B);
select * from B where id in (select id from A);

相当于 inner join 的情况

gown_way的gravatar头像
gown_way  LV11 2015年4月28日

如果没有对两表没做其他的操作,个人应该一样,都要将B表的id与A表的每一条记录的id值相比较,相等的就join。我也是菜鸟,只会简单的操作,如果有大神回复你了,麻烦告诉我一声,共同学习。。!

浪子逍遥遥的gravatar头像
浪子逍遥遥  LV18 2015年4月28日

.select * from A where id in (select id from B);
.select * from B where id in (select id from A);
.select * from A left join B on A.id = B.id;
.select * from B left join A on B.id = A.id;
.select * from A as AA,B as BB where AA.id = BB.id

数据少的做主表,而且你上面提供的5种查询方法中,只有第2种方法(数据量小的做主表)查询出来是正确的,其他查询出来都是错误的数据.

1,3,4三个方法都是把数据量大的表所有数据都查出来,5的方法是把数据量小的表的数据全部查出来

zakari的gravatar头像
zakari  LV12 2015年4月29日

建议你自己做个实验,自己的体会才是最深刻的,体验时候最好数据量上百万,要不效果不是很明显。

aliger的gravatar头像
aliger  LV11 2015年4月30日

自己试一下最重要

a表有几十条索引,b表几条索引还有分区 a 表 728039 条 b表 8809883 条

(1)select count(1) from a a left join b b on a.id=b.id;----3.531  --3.188  --9284472


(2)select count(1) from a a left join b b on a.id=b.id; ----3.359  --1.609  --8809883

(3) select * from A as AA,B as BB where AA.id = BB.id  ----3.062   --2.593 --8744249

(4) select * from A where id in (select id from B);  --4.234     --3    --187816
(5) select * from B where id in (select id from A);  --55.421    --2.657  --8744249

结果:

(1)select * 时长为3.531秒,count(1)时长为3.188  数据为9284472 

(2)select * 时长为3.359秒,count(1)时长为1.609  数据为8809883

 

 所以你还要根据你的业务来

 

773664964的gravatar头像
773664964  LV14 2015年5月6日

少的一方做主表,举个例子来说

一个老师,与一个班级的学生、

一个老师很难记住全部的学生,全部的学生可以很容易的记住一个老师

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友