【问题标题】:Mysql query efficiency [closed]Mysql查询效率[关闭]
【发布时间】:2013-03-10 16:56:55
【问题描述】:

我们有一个名为 product 的表,其中 productID 作为主键。然后我们有一个名为 productProcess 的表,其中存储了 productID 和 processID。所以现在我们要搜索在 productProcess 表中没有实例的所有 productID。目前我们运行两个查询,首先是所有产品,第二个是来自 productProcess 的产品 ID,并且选择了那些不存在的。还有其他机制吗?

【问题讨论】:

  • 我有这个表,我有那个表,但是需要优化的查询在哪里?
  • 是的。你试过什么?
  • 我首先从 tblProduct 中选择 productId。然后我尝试从 tblProductProcess 中选择不同的 productID。然后我比较两者并选择那些 productID 在第二个查询中不存在。

标签: php mysql sql join


【解决方案1】:

是的,有。使用LEFT JOIN

SELECT  a.*      // this will get all columns from product table.
FROM    product a
        LEFT JOIN productProcess b
            ON a.productID = b.productID
WHERE   b.productID IS NULL

如需进一步了解联接,请访问以下链接:

如果更快的话,另一个提示是设置表productProcessproductID 一个外键。

【讨论】:

  • 是的 productID 是外键,但我不明白为什么我们必须把 b.productID IS NULL ?
  • 哦,我明白了,记住我们使用的是LEFT JOIN,它会返回左侧表格中的所有记录。在第二个表上没有匹配 ID 的记录在其他列上的值为 null。用于演示:>>CLICK_HERE<<
  • 好的,我现在明白了。
  • @biz14 很高兴听到这个消息。 :)
【解决方案2】:

假设product.productID 不能为NULL

SELECT product.productID 
FROM product
LEFT JOIN productProcess
ON productProcess.productID = product.productID
WHERE productProcess.productID IS NULL

另一个选项是WHERE NOT EXIST:

SELECT product.productID
FROM product
WHERE NOT EXISTS (
  SELECT productID FROM productProcess
  WHERE productProcess.productID = product.productId
)

【讨论】:

  • 哪个生成结果更快?
  • 测试一下,它会告诉你的。两者在这里工作大致相同,但在不同的 mysql 服务器版本中往往会有所偏差。
  • 好的,我会测试它,但我认为第一个查询你必须在 productProcess.productID = product.productID 上交换这个
  • 呃,交换?需要详细说明吗?目前我认为这条线没有任何问题。
【解决方案3】:

您可以使用左连接。 如果您可以使用左连接,则结果将是与 products 和 ProductsProcess 相关的所有产品。

SELECT  p.* 
FROM    (product p LEFT JOIN productProcess pp ON a.productID = b.productID)
WHERE   pp.productID IS NULL

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多