2013-07-22 56 views
0

catalog_product_category_bindings表結構:MySQL - 左連接或嵌套選擇用於過濾不存在​​的行?

`productID` INTEGER UNSIGNED NOT NULL 
`categoryID` INTEGER UNSIGNED NOT NULL 

表結構catalog_products

`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT 
misc unrelated columns 

任務:獲取的未綁定到任何類別(在catalog_product_category_bindings沒有進入)所有的產品數據。

查詢#1(使用LEFT JOIN):

SELECT cp.* FROM catalog_products AS cp 
LEFT JOIN catalog_product_category_bindings AS cpcb 
ON cp.id = cpcb.productID 
WHERE cpcb.categoryID IS NULL 

查詢#2(使用嵌套選擇):

SELECT cp.* FROM catalog_products AS cp 
WHERE id NOT IN 
(SELECT productID FROM catalog_product_category_bindings) 

兩個查詢似乎是在我的錶速度方面非常相似(我沒有太多內容),但我相信第二個表現會更差,因爲它可能會循環遍歷catalog_products表中的每個id,並將它與每個從catalog_product_category_bindings進行比較。更不用說它可能不會返回任何內容並完全中斷查詢(儘管這隻會在表被截斷時發生)。

你會說哪個更好?我個人更喜歡#1,因爲它更適合我的查詢生成器,看起來總體上更好。

+0

你說得對。我也支持你 – Akhil

回答

1

因爲你所有的列被定義爲NOT NULL MySQL優化NOT IN()查詢無論如何不存在。兩者之間沒有太大的區別。

Here是必讀的主題。

+0

好吧,我會堅持我的LEFT JOIN,因爲他們的表現相同。感謝您的鏈接! – jurchiks