日期:2014-05-16  浏览次数:20523 次

mysql多表查询是关联表快还是字段查询快,内容举例!
表A
userid 
name
age

表B
id
userid

根据B表查询A表信息
方法1:
select a.userid,a.name,a.age from 表A a,表B b
where a.userid = b.userid and b.id = '';
方法2:
select b.userid,
(select a.name from 表A a where a.userid = b.userid) as name
(select a.age from 表A a where a.userid = b.userid) as age
from 表B b 
where b.id = '';

想请教一下大神,这两个方法那个执行的速度快,为什么?
------解决方案--------------------
如果没有where b.id = '' 这个条件,肯定方法1好(虽然还有更好的)。
但有where b.id = ''这个条件,方法B速度好像快些。遍历B的行数+2倍的遍历表A的行数;而方法1是表A×表B。

但还是推荐方法1,通用点。
------解决方案--------------------
我更喜欢写成:
select a.userid,a.name,a.age 
from 表A a  
join (select * from 表B where id='') b on a.userid=b.userid
------解决方案--------------------
两表关联,基本就是关联 A行数×B行数,这个次数。先通过Where条件 把A和B的行数降低再相乘,当然次数少。

你那个例子,先Where ID=1行(遍历一遍B),再相乘就是A×1,所以总遍历行数是 A+B,当然比通常情况A×B快。我是这么理解的
------解决方案--------------------
应该是第一种快,一般通过表关联实现的效率,要高于通过相关子查询的效率,你可以在数据量稍大的情况下,验证一下。

create table a(userid int,name varchar(20),age int);


create table b(id int,userid int)



select a.userid,a.name,a.age 
from A a
inner loop join B b
        on a.userid = b.userid and b.id = '';


select b.userid,
(select a.name from A a where a.userid = b.userid) as name,
(select a.age from A a where a.userid = b.userid) as age
from B b 
where b.id = '';



从执行计划来看,第一种优于第二种,而且执行计划非常简洁,而第二种方式的执行计划复杂的多。
------解决方案--------------------
数据量小可以用 笛卡尔积 select * from tbl_a,tbl_b  但是想想一下如果你有2表都有超过100万行的数据,100万*100万 那是很恐怖的。
------解决方案--------------------
前几天碰到过一个怪问题。
之前都说将Where放在子查询的里面,速度会快一点。而我将where放在里面,速度反而慢了,而将where放在最外面,速度快多了。

就类似这一句:
select a.userid,a.name,a.age 
from 表A a  
join (select * from 表B where id='') b on a.userid=b.userid 

我遇到的是不如下面的这样的快。
select * from (select a.userid,a.name,a.age ,b.id
from 表A a  
left join 表B b on a.userid=b.userid 
) aa
where id=''

当然,实际上SQL语句非常复杂了。