PHP“;简单的;查询需要大量时间

PHP“;简单的;查询需要大量时间,php,mysql,sql,database,Php,Mysql,Sql,Database,我有一个关于性能的问题,我想我做错了什么 我有一个表与项目,另一个与类别,任何项目可以在多个类别。现在我想显示所有不包含在任何类别中的项目 连接在表Items\u Categories中(仅限于ID\u item和ID\u Categories) 我提出这个问题: SELECT * FROM Items AS i WHERE ID_item NOT IN ( SELECT DISTINCT ID_item FROM Items_Categories ) 它能工作,但速度很慢。

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

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

连接在表
Items\u Categories
中(仅限于
ID\u item
ID\u Categories

我提出这个问题:

SELECT *
FROM Items AS i
WHERE ID_item NOT
IN (
    SELECT DISTINCT ID_item
    FROM Items_Categories
) 
它能工作,但速度很慢。这需要几秒钟的时间,我的数据库并没有那么大。我有大约3000种商品,大概200种


有更好的解决方案吗?

您可能可以使用联接来代替,并找到没有任何匹配项的联接

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

您可能可以使用联接来查找不匹配的联接

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

您可能可以使用联接来查找不匹配的联接

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

您可能可以使用联接来查找不匹配的联接

SELECT i.* 
FROM items i
LEFT JOIN Items_Categories ic
    ON i.ID_item = ic.ID_Item
WHERE
    ic.ID_Item IS NULL
试着这样做:

SELECT i.* 
FROM Items AS i 
LEFT JOIN Items_Categories  IC on IC.ID_item = I.ID_item
where IC.ID_item is null
试着这样做:

SELECT i.* 
FROM Items AS i 
LEFT JOIN Items_Categories  IC on IC.ID_item = I.ID_item
where IC.ID_item is null
试着这样做:

SELECT i.* 
FROM Items AS i 
LEFT JOIN Items_Categories  IC on IC.ID_item = I.ID_item
where IC.ID_item is null
试着这样做:

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

您可以采用这种方法,按照Mark Baker的建议,通过解释检查您和我的执行计划:

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

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

您可以采用这种方法,通过解释检查您和我的执行计划,正如Mark Baker建议的那样:

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

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

您可以采用这种方法,通过解释检查您和我的执行计划,正如Mark Baker建议的那样:

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

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

您可以采用这种方法,通过解释检查您和我的执行计划,正如Mark Baker建议的那样:

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

当然,您应该为两个表中的ID\u item列编制索引。

您需要选择所有内容吗?如果不仅选择所需的列,还可以告诉我们这些表上有哪些索引,以及查询解释的结果显示了什么,从而加快查询启动速度。是否需要选择所有内容?如果不仅选择所需的列,还可以告诉我们这些表上有哪些索引,以及查询解释的结果显示了什么,从而加快查询启动速度。是否需要选择所有内容?如果不仅选择所需的列,还可以告诉我们这些表上有哪些索引,以及查询解释的结果显示了什么,从而加快查询启动速度。是否需要选择所有内容?如果不仅选择所需的列,还可以告诉我们这些表上有哪些索引,以及查询解释的结果显示了什么,从而加快查询启动速度。这将返回带有类别的项,还将返回那些没有包含所有类别的项。@VMai谢谢!Iv'e更改了它这也将返回带有类别的项目,它将返回那些没有包含所有类别的项目。@VMai谢谢!Iv'e更改了它这也将返回带有类别的项目,它将返回那些没有包含所有类别的项目。@VMai谢谢!Iv'e更改了它这也将返回带有类别的项目,它将返回那些没有包含所有类别的项目。@VMai谢谢!我改变了它