【问题标题】:SQL speed increase: Left Join, or Cartesian product/where clauseSQL 速度提升:Left Join 或笛卡尔积/where 子句
【发布时间】:2014-08-12 18:16:10
【问题描述】:

我正在使用 web 服务中的 sql 查询,并希望提高它的速度。截至目前,该查询采用多个表的笛卡尔积并使用 where 子句将它们分开。

我想知道切换到 LEFT JOIN 是否会使查询执行得更快,因为我想要的结果中的每一行都基于一个表,而其他信息则是从其他表中提取的。

【问题讨论】:

  • 作为一个好的经验法则,最好按照 mysql 的预期连接方式来连接表...也就是不要做笛卡尔积...用 WHERE 连接过滤器数据的表。 ..除此之外,在做一个或另一个时,速度方面并没有太大的区别。你应该考虑为你的表添加索引
  • 您可以发布您的查询吗?

标签: java mysql sql


【解决方案1】:

无法使用笛卡尔语法在 MySQL 中表达 LEFT JOIN 的意图。

在 Oracle 中,这种所谓的 omega-join 语法

SELECT whatever FROM A, B WHERE A.col=B.col(+) 

等价于:

SELECT whatever FROM A LEFT JOIN B ON A.col=B.col

但在 MySQL 中,只有后一种语法有效。因此,如果您想在 MySQL 中执行真正的 LEFT JOIN 操作,您别无选择:笛卡尔/WHERE 语法不起作用。

就优化而言,MySQL 的查询执行计划器很好地理解了以笛卡尔/WHERE 语法表示的普通INNER JOIN 操作。但是使用 JOIN 语法几乎总是更好。它更容易阅读,查询规划器也能理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多