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:
lxylxy8866 2008-7-17 18:11
黑黑,长高了吗?
lxylxy8866 2008-7-17 18:11
长肥了没哈?