PHP视频教学,让你更快更轻松的掌握PHP。

查看完整版本: 大家觉得这两条SQL语句有差别吗?

robin 2008-7-15 09:17

大家觉得这两条SQL语句有差别吗?

第一条 :[php]select distinct(a.account_md5),a.wlfor,b.sid from verify_for as a left join verify_fee_log as b on a.userid=b.userid where a.mtime>'2008-07-13 00:00:00' and a.mtime<='2008-07-13 23:59:59' [/php]

第二条: [php]SELECT DISTINCT (a.account_md5) as account, a.wlfor as wlfor, b.sid as sid FROM verify_for AS a, verify_fee_log AS b WHERE  a.userid = b.userid AND a.mtime > '2008-07-13 00:00:00' AND a.mtime <= '2008-07-13 23:59:59'[/php]

两个表分别是10W和30W条记录

可是我执行第一条的时候MYSQL就崩掉了  MYSQL占用CPU100%

而第二条马上就出来结果了

是什么原因呢?

貌似left join只能是小表傍大表   而不能是两个同数量级的表一起查询

应该是吧?

libaiyi 2008-7-15 11:09

值得学习啊所长,MYSQL一些东西我都不太懂:06:

wawehi 2008-7-15 18:39

left join 只能先查找左边的这个表,找出结果后再去执行右边的表,再进行联合,
第二条SQL执行时没有此缺陷,两个表的查询动作可以并行,
一般尽量少用LEFT JOIN吧,MYSQL手册中有说到这个

lxylxy8866 2008-7-15 18:49

从从结果集方面来讲
第一个是先搜a表,取得所有a表中符合where条件的记录,然后用b表中的字段填充所取得的结果集
第二个是从a、b表中取得同时符合where条件的结果集
从集合的意义上来说,第二条sql的结果集是第一条sql结果集的子集
第一个效率高,
第二个数据量大的时候就可能崩哟,
但为什么你第一个崩了呢?

[[i] 本帖最后由 lxylxy8866 于 2008-7-16 08:46 编辑 [/i]]

robin 2008-7-16 09:11

向阳~~
事实上第一条执行 MYSQL占用CPU100%
第二条几乎马上就出结果了
left join恐怕只适合小表傍大表吧
left join 只能先查找左边的这个表,找出结果后再去执行右边的表,再进行联合,就像三楼说的

极品黑公子 2008-7-16 11:07

内连接(Inner Join)
内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。
下面是ANSI SQL-92标准

select *
from t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等价于早期的连接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

极品黑公子 2008-7-16 11:09

剩下的就是内联与外联的区别了,手册上写的清清楚楚:70:

robin 2008-7-16 14:25

区别是什么?
老黑不要吝啬  贴出来吧
我一下子找不到

robin 2008-7-16 14:26

我要的就是这个解释  内联合外联的区别
不过left join是内联吗?

极品黑公子 2008-7-17 09:40

:64: 是内联与左联的区别,大哥你自己查吧,百度上一查一大堆

极品黑公子 2008-7-17 09:41

[url]http://www.dophp.net/thread-920-1-2.html[/url]
看三楼的 :53:

robin 2008-7-17 10:07

:08:

lxylxy8866 2008-7-17 18:11

黑黑,长高了吗?

lxylxy8866 2008-7-17 18:11

长肥了没哈?
页: [1]
查看完整版本: 大家觉得这两条SQL语句有差别吗?