【问题标题】:Why LEFT JOIN is terribly slower than INNER JOIN?为什么 LEFT JOIN 比 INNER JOIN 慢得多?
【发布时间】:2019-10-09 16:40:40
【问题描述】:

我有两个表,toynav_product_import - 18533 行,catalog_product_entity - 42000 行。

下面的查询,LEFT JOIN 耗时超过 2 分钟,而 INNER JOIN 运行耗时 0.009 秒。第一个表具有条形码字段的必要索引。

SELECT tpi.barcode FROM  toynav_product_import tpi
INNER  JOIN catalog_product_entity cpe ON tpi.barcode = cpe.sku

请指教

toynav_product_import

目录产品实体

【问题讨论】:

标签: mysql


【解决方案1】:

LEFT JOINInner Join 慢。根据定义,外连接(LEFT JOINRIGHT JOIN)必须完成INNER JOIN 的所有工作以及对结果进行空值扩展的额外工作,这就是原因。并且与内部联接相比,它还返回更多行数,这就是执行需要更多时间的原因。 但是通过正确地索引 外键,您绝对可以提高连接的性能。

这也取决于数据,Left join 并不总是较慢,也有 Left join 较快的情况,但根据上述原因,大多数 Inner join 较快。 请参考这个link,这家伙解释的很清楚。

【讨论】:

  • 我同意这一点。但在这种情况下,两者都应该产生相同数量的结果。两个查询之间根本不应该有 2 分钟的差异。
  • 即使结果中的行数相同。仍然系统做同样的事情来检查额外的行数。但是这里为什么不将 SKU 作为外键?添加索引和添加外键肯定会提高性能。
【解决方案2】:

外部联接(LEFT JOIN 或 RIGHT JOIN)必须完成 INNER JOIN 的所有工作以及空扩展结果的额外工作

即使 LEFT JOIN 在特定情况下更快,它在功能上并不等同于 INNER JOIN,因此您不能简单地将一个实例的所有实例替换为另一个实例!

抱歉,不能将此作为评论发布

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 2013-02-07
    • 2019-04-22
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2020-03-07
    相关资源
    最近更新 更多