0

表结构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)

就我的表的速度而言,这两个查询似乎非常相似(我在那里没有太多),但我相信第二个查询的性能更差,因为它可能会循环遍历表id中的catalog_products每一个并将其与productID来自的每一个进行比较catalog_product_category_bindings. 更不用说它可能不会返回任何东西并完全破坏查询(尽管只有在表被截断时才会发生这种情况)。

你说哪个更好?我个人更喜欢#1,因为它更适合我的查询构建器,而且看起来通常更好。

4

1 回答 1

1

由于您的所有列都定义为NOT NULLMySQLNOT IN()无论如何都会优化查询以使其不存在。两者没有太大区别。

是有关该主题的必读内容。

于 2013-07-22T10:09:24.573 回答