【问题标题】:PHP "Simple" query takes massive timePHP“简单”查询需要大量时间
【发布时间】:2014-08-01 08:03:17
【问题描述】:

我有一个关于性能的问题,我想我做错了什么。

我有一个包含项目的表,另一个包含类别的表,任何项目都可以属于多个类别。现在我想显示所有不包含在任何类别中的项目。

连接在表 Items_Categories 中(仅使用 ID_itemID_category

我做了这个查询:

SELECT *
FROM Items AS i
WHERE ID_item NOT
IN (
    SELECT DISTINCT ID_item
    FROM Items_Categories
) 

它可以工作,但速度很慢。这需要几秒钟,我的数据库不是那么大。我有大约 3000 个项目和 200 个类别。

有更好的解决方案吗?

【问题讨论】:

  • 您需要选择所有内容吗?如果不只选择你需要的列,这样会加快查询速度
  • 首先告诉我们您在这些表上有哪些索引,以及查询中 EXPLAIN 的结果显示了什么

标签: php mysql sql database


【解决方案1】:

您或许可以改用 JOIN 并找到没有任何匹配的那些。

SELECT i.* 
FROM items i
LEFT JOIN Items_Categories ic
    ON i.ID_item = ic.ID_Item
WHERE
    ic.ID_Item IS NULL

【讨论】:

    【解决方案2】:

    试试这个方法:

    SELECT i.* 
    FROM Items AS i 
    LEFT JOIN Items_Categories  IC on IC.ID_item = I.ID_item
    where IC.ID_item is null
    

    【讨论】:

    • 这也会返回带有类别的项目,它会返回那些没有获得所有类别的项目。
    • @VMai 谢谢!我已经改变了它
    【解决方案3】:

    您可以按照 Mark Ba​​ker 的建议采用这种方法并使用 EXPLAIN 检查您和我的​​执行计划:

    SELECT
        *
    FROM
        Items i
    WHERE NOT EXISTS (
        SELECT 1 FROM Items_Categories WHERE ID_item = i.ID_item
    );
    

    当然,您应该在两个表中都为 ID_item 列建立索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多