2011-10-20 42 views
0

我試圖從沒有在另一列存在於同一個表子查詢比聯接運行速度快嗎?

子查詢

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秒結果

通常加快返回結果的速度。所以我相信我在查詢中做了一些有趣的事情? 但找不到任何理由爲什麼我的子查詢運行速度比

+0

葉氏,MySQL和運行通過phpmyadmin這些查詢 – tejash

+3

你真的應該剛剛簡化你的例子所以不是「有穿 - 服裝1」只是被替換爲「富」或類似的。這使得它最初很難看到你實際上想要做什麼 – Seph

回答

4

聲明「通常加入更快的返回結果。」很愚蠢,特別是沒有提及任何特定的數據庫系統。

很多因素會決定某個特定查詢的性能。您可以在您使用的任何數據庫產品中使用EXPLAIN工具來確定在這種情況下子查詢的優先順序(提示:它可能與使用關鍵字DISTINCT有關)。

+0

抱歉沒有描述數據庫系統。我正在使用mysql並通過phpmyadmin接口運行這些查詢。對於不同的,我有一個相同的疑問,但是最初當我試圖查詢去除仍然有從那裏條件我不能刪除table2.sku一個相同的結果 – tejash

0

主要的原因是,你的左連接語句未優化。 WHERE條件WHERE table2.sku IS NULL和table1。 Wear it With - Outfits 1 IS NOT NULL 會浪費很多時間,特別是在這種情況下。 您應該在離開加入之前優化table2。 PS:表2中的記錄數量應達到相當數量。

+0

是Null作爲它的一個基本方式,你如何轉換你不是在子查詢中加入以供參考(http://dev.mysql.com/doc/refman/5.1/en/rewriting-subqueries.html)如果我刪除table.wear它 - 服裝1,那麼它確實使在時間查詢太大的變化了。 – tejash

相關問題