mysql left join 效率高_SQL中 LEFT JOIN ON 条件的效率高低比较?

这里按 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)

查看执行计划如下

可以看出这种情况下用到了子查询(派生表)物化的方式来做关联。所以如果用到子查询物化做临时表的方式,就多了创建和访问临时表的成本,这种效率肯定就更低了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值