mysql多个on,在多个连接中放置’on’条件哪里更好? (MySQL的)

我有多个连接,包括mysql中的左连接.有两种方法可以做到这一点.

>我可以在每次加入后立即设置“ON”条件:

select * from A join B ON(A.bid=B.ID) join C ON(B.cid=C.ID) join D ON(c.did=D.ID)

>我可以把它们全部放在一个“ON”条款中:

select * from A join B join C join D ON(A.bid=B.ID AND B.cid=C.ID AND c.did=D.ID)

哪种方式更好?

如果我在查询中需要左连接或右连接,它是否不同?

解决方法:

对于简单的用途,MySQL几乎不可避免地以相同的方式执行它们,因此它是一种偏好和可读性(这是一个很好的辩论主题).

但是,对于更复杂的查询,尤其是具有OUTER JOIN的聚合查询,这些查询有可能成为磁盘并且受到约束 – 在不使用带有OUTER JOIN查询的WHERE子句时,可能会有性能和看不见的含义.

运行8分钟或.8秒的查询之间的差异可能最终取决于WHERE子句,特别是当它与索引(How MySQL uses Indexes)相关时:WHERE子句是向查询优化器提供所需信息的核心部分.做它的工作并告诉引擎如何以最有效的方式执行查询.

“This section discusses optimizations that can be made for processing

WHERE clauses…The best join combination for joining the tables is

found by trying all possibilities. If all columns in ORDER BY and

GROUP BY clauses come from the same table, that table is preferred

first when joining.”

For each table in a join, a simpler WHERE is constructed to get a fast

WHERE evaluation for the table and also to skip rows as soon as

possible

一些例子:

全表扫描(类型= ALL),不使用EXTRA中的位置

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr

LEFT JOIN CReportsCA cr2

ON cr.id = cr2.id AND cr.role = cr2.role AND cr.util = 1000

[Err] Out of memory

使用索引(使用where,Using index)来优化结果的位置:

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr

LEFT JOIN CReportsCA cr2

ON cr.id = cr2.id

WHERE cr.role = cr2.role

AND cr.util = 1000

515661 rows in set (0.124s)

**** ON / WHERE的组合 – 相同的结果 – EXPLAIN *******中的相同计划

[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr

LEFT JOIN CReportsCA cr2

ON cr.id = cr2.id

AND cr.role = cr2.role

WHERE cr.util = 1000

515661 rows in set (0.121s)

MySQL通常足够聪明,能够找出如上所述的简单查询,并且会以类似方式执行它们,但在某些情况下它不会.

外连接查询性能:

由于LEFT JOIN和RIGHT JOIN都是OUTER JOINS(Great in depth review here)出现了笛卡尔积的问题,因此必须避免使用表扫描,以便尽可能快地消除查询不需要的尽可能多的行.

在哪里,索引和查询优化器一起使用可以完全消除笛卡尔积与小型函数(如AVERAGE,GROUP BY,SUM,DISTINCT等)一起使用时所带来的问题.运行时间减少的数量级通过适当的索引来实现.用户和WHERE子句的使用.

最后

同样,对于大多数查询,查询优化器将以相同的方式执行这些 – 使其成为一种偏好方式,但是当查询优化变得重要时,WHERE是一个非常重要的工具.通过将索引col指定为附加的ON..AND ON子句,我已经看到在某些情况下使用INNER JOIN会有一些性能提升,但我无法告诉您原因.

标签:mysql,join,on-clause

来源: https://codeday.me/bug/20190725/1533517.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值