簡體   English   中英

MySQL-左聯接還是嵌套選擇用於過濾不存在​​的行?

[英]MySQL - left join or nested select for filtering non-existing rows?

catalog_product_category_bindings表結構:

`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每個productID 更不用說它可能不會返回任何內容並完全中斷查詢(盡管只有在表被截斷的情況下才會發生)。

您說哪個更好? 我個人更喜歡#1,因為它更適合我的查詢生成器,而且看起來通常更好。

由於所有列均定義為NOT NULL MySQL會優化NOT IN()查詢,使其不存在。 兩者之間沒有太大區別。

這里必須閱讀有關該主題的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM