- 论坛徽章:
- 0
|
本帖最后由 chinafenghao 于 2013-03-04 09:01 编辑
话不多说,直接求教.
之前我在一本书上看到了mysql执行计划的说明(忘记是哪本书了,mysql开发者SQL权威指南或MYSQL技术内幕:SQL编程,因为书不在身边,无法确认,见谅!).
大概意思就是,当对两个表进行联合查询的时候,会首先把两个表进行一次值积的计算,把这个集合存进一个VT内.然后通过他们的链接条件,过滤成一额新的VT。然后再执行其他子句,例如WHERE.通过WHERE子句,在形成一个VT,然后再次执行其他子句,例如LIMIT.
以下是例子:
select * from a left b join on a.id = b.a_id where a.name = 'name' limit 0,3;
1.对a和b进行笛卡尔积计算,形成一个VT1
2.对VT1进行a.id = b.a_id过滤,形成VT2
3.对VT2进行a.name = 'name'过滤,形成VT3
4.对VT3进行LIMIT 过滤,形成VT4
5.返回VT4
然后,晚上看到了简朝阳先生的blog,他对这个过程有另外一个的说法
1.先对a.name = 'name'过滤,形成VT1
2.用VT1的数据,循环和b进行ON条件对比
3.进行LIMIT
4.返回
请问,哪个说法才是合适的呢?
虽然个人比较愿意相信第二个说法,因为相对来说,效率会高很多.但是两个都是权威人士的说法.求各位指点一二.
另,个人认为,两个说法对是否使用子查询,有很大的影响,例如
select * from a,(select * from b where age > 30) as c where a.id = c.a_id;
上面用到了子查询,子查询是通过建立一个临时表来进行的.
如果join原理是第一种说法的话,那么上面这个子查询将比使用inner join更合理。
因为先通过子查询,缩小了联表的集合范围,这样将会减小笛卡尔积,提高查询效率
可是,如果是第二种说法的话,因为子查询使用了临时表,这样将会比inner join的效率低。
新人掘见.再次恳求指点. |
|