【问题标题】:Subquery is running faster than join?子查询比连接运行得快?
【发布时间】:2011-12-11 10:58:25
【问题描述】:

我正在尝试从同一表的另一列中确实存在的一列中识别值

子查询

SELECT DISTINCT `Wear it With - Outfits 1` 
  FROM `product list` 
 WHERE `Wear it With - Outfits 1` NOT IN (SELECT `sku` 
                                            FROM `product list`)

...在 2.7287 秒内返回结果

我尝试用左连接替换子查询

   SELECT DISTINCT table1.`Wear it With - Outfits 1`
     FROM `product list` as table1 
LEFT JOIN `product list` as table2 ON table1.`Wear it With - Outfits 1`=table2.sku
     WHERE table2.sku IS NULL 
       AND table1.`Wear it With - Outfits 1` IS NOT NULL

...在 5.7651 秒内返回结果

通常连接返回结果要快得多。所以我相信我在查询中做了一些有趣的事情? 但是找不到任何原因为什么我的子查询运行得比

【问题讨论】:

  • 是的,MySQL 并通过 phpmyadmin 运行这些查询
  • 你真的应该简化你的例子,而不是'穿它 - 服装 1' 只是替换为'foo'或类似的东西。这让你最初很难看到你真正想要做什么

标签: mysql sql join subquery


【解决方案1】:

语句“通常连接返回结果要快得多。”很傻,尤其是没有参考任何特定的数据库系统。

许多因素都会影响特定查询的性能。您可以在您正在使用的任何数据库产品中使用 EXPLAIN 工具来确定为什么在这种情况下子查询更可取(提示:它可能与关键字 DISTINCT 的使用有关)。

【讨论】:

  • 很抱歉没有描述数据库系统。我正在使用 mysql 并通过 phpmyadmin 界面运行这些查询。关于不同,我最初也有同样的疑问,但是当我尝试删除查询时仍然得到相同的结果
【解决方案2】:

主要原因是你的左连接语句没有优化。 WHERE 条件 WHERE table2.sku IS NULL 和 table1.Wear it With - Outfits 1 IS NOT NULL 可能会浪费很多时间,尤其是在这种情况下。 您应该在离开联接之前优化 table2。 PS:table2的记录数应该达到了相当的数量。

【讨论】:

  • 从哪里我无法删除 table2.sku 的条件是 Null,这是一种基本方式,如果我删除 table.wear 它与 - Outfits 1 那么它确实在查询时间上有很大的变化。
猜你喜欢
  • 2019-09-10
  • 2017-06-17
  • 1970-01-01
  • 2018-01-04
  • 2019-12-22
  • 1970-01-01
  • 2016-03-06
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多