[英]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.