MySQL - 左连接还是嵌套选择,用于过滤不存在​​的行?

时间:2013-07-22 09:57:22

标签: mysql select join

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,因为它更适合我的查询构建器,看起来通常更好。

1 个答案:

答案 0 :(得分:1)

由于您的所有列都定义为NOT NULL,因此MySQL会优化NOT IN()查询到不存在。两者之间没有太大区别。

Here必须阅读有关该主题的内容。