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语句非常复杂了。