子查询比连接运行得更快?

时间:2011-10-20 03:15:29

标签: mysql sql join subquery

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

子查询

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

...将结果返回2.7287sec

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

   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秒

通常加入返回结果的速度要快得多。所以我相信我在查询中做了一些有趣的事情? 但是找不到我的子查询运行速度比

更快的原因

2 个答案:

答案 0 :(得分:4)

声明'正常加入返回结果的速度要快得多'。是愚蠢的,特别是没有参考任何特定的数据库系统。

确定特定查询的性能有很多因素。您可以在任何正在使用的数据库产品中使用EXPLAIN工具来确定在这种情况下子查询的优选原因(提示:它可能与使用关键字DISTINCT有关)。

答案 1 :(得分:0)

主要原因是您的左连接语句未进行优化。 WHERE条件WHERE table2.sku IS NULL和table1。Wear it With - Outfits 1 IS NOT NULL  可能会浪费很多时间,特别是在这种情况下。 您应该在离开加入之前优化table2。 PS:表2中的记录数量应该达到相当大的数量。