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

honghuabin 2013-06-21 02:07:48
表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 = '';

想请教一下大神,这两个方法那个执行的速度快,为什么?
...全文
630 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
释雪枫 2014-03-05
  • 打赏
  • 举报
回复
会更快点! (不好意思,手贱,还没打完不小心就提交了)
释雪枫 2014-03-05
  • 打赏
  • 举报
回复
select a.userid,a.name,a.age ,b.id from 表A a left join 表B b on a.userid=b.userid where b.id=''
释雪枫 2014-03-05
  • 打赏
  • 举报
回复
引用 8 楼 zbdzjx 的回复:
前几天碰到过一个怪问题。 之前都说将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语句非常复杂了。
我怎么觉得
zbdzjx 2013-07-03
  • 打赏
  • 举报
回复
前几天碰到过一个怪问题。 之前都说将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语句非常复杂了。
kissme168 2013-07-02
  • 打赏
  • 举报
回复
数据量小可以用 笛卡尔积 select * from tbl_a,tbl_b 但是想想一下如果你有2表都有超过100万行的数据,100万*100万 那是很恐怖的。
LongRui888 2013-06-22
  • 打赏
  • 举报
回复
应该是第一种快,一般通过表关联实现的效率,要高于通过相关子查询的效率,你可以在数据量稍大的情况下,验证一下。
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 = '';

从执行计划来看,第一种优于第二种,而且执行计划非常简洁,而第二种方式的执行计划复杂的多。
honghuabin 2013-06-21
  • 打赏
  • 举报
回复
引用 4 楼 spiritofdragon 的回复:
两表关联,基本就是关联 A行数×B行数,这个次数。先通过Where条件 把A和B的行数降低再相乘,当然次数少。 你那个例子,先Where ID=1行(遍历一遍B),再相乘就是A×1,所以总遍历行数是 A+B,当然比通常情况A×B快。我是这么理解的
那个join方法是按照你的习惯这样写,还是说这样写确实会好一些?
spiritofdragon 2013-06-21
  • 打赏
  • 举报
回复
两表关联,基本就是关联 A行数×B行数,这个次数。先通过Where条件 把A和B的行数降低再相乘,当然次数少。 你那个例子,先Where ID=1行(遍历一遍B),再相乘就是A×1,所以总遍历行数是 A+B,当然比通常情况A×B快。我是这么理解的
honghuabin 2013-06-21
  • 打赏
  • 举报
回复
引用 2 楼 spiritofdragon 的回复:
我更喜欢写成: select a.userid,a.name,a.age from 表A a join (select * from 表B where id='') b on a.userid=b.userid
这样写有的好处是什么?能讲解 一下吗?
spiritofdragon 2013-06-21
  • 打赏
  • 举报
回复
我更喜欢写成: select a.userid,a.name,a.age from 表A a join (select * from 表B where id='') b on a.userid=b.userid
spiritofdragon 2013-06-21
  • 打赏
  • 举报
回复
如果没有where b.id = '' 这个条件,肯定方法1好(虽然还有更好的)。 但有where b.id = ''这个条件,方法B速度好像快些。遍历B的行数+2倍的遍历表A的行数;而方法1是表A×表B。 但还是推荐方法1,通用点。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧