赞
踩
这里按 MySQL 数据库来说明,这两个查询语言,第一种是左连接的方式,第二种是左连接关联子查询的方式。
这里面主要是第二种用了子查询这种方式,关于这种情况下的子查询,又叫派生表,MySQL 对这种情况,有两种处理方式。第一种是把派生表物化,也就是生成临时表,然后再做关联操作。第二种会把派生表和外层查询合并,重新调整 SQL 语句,比如这里的第二种查询方式,就有可能直接被重新调整为第一种,如果是这种方式,那二种写法的效率肯定是一样的。
这里,根据问题,新建两张测试表 t_a和 t_b 如下,两张表 id 为主键。t_at_b
执行下面语句查看查询语句一的执行计划
explain SELECT * FROM t_a as a LEFT JOIN t_b as b ON a.id = b.id AND b.name = '123';
查看执行计划一如下
执行下面语句查看查询语句二的执行计划
explain SELECT * FROM t_a as a LEFT JOIN (SELECT * FROM t_b WHERE name = '123') b ON a.id = b.id;
查看执行计划二如下
可以看出两条语句的执行计划是一样的,从这里就可以看出,第二种查询语句,被重新调整为第一种,这时,其实这两种语句的效率是一样的。当然,这是数据量比较小的情况,数据量大的时候,也可以通过查看执行计划来查看效率。
比如执行下面的语句
explain SELECT * FROM t_a A WHERE a.key2 in (SELECT key3 FROM t_b)
查看执行计划如下
可以看出这种情况下用到了子查询(派生表)物化的方式来做关联。所以如果用到子查询物化做临时表的方式,就多了创建和访问临时表的成本,这种效率肯定就更低了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。