PHP"简单"查询需要大量时间

时间:2014-08-01 08:03:18

标签: php mysql sql database

我对性能有疑问,我猜我做错了。

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

表格Items_Categories中的连接(只有ID_itemID_category

我提出了这个问题:

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

它有效,但速度很慢。这需要几秒钟,而我的数据库并不是那么大。我有大约3000个项目,也许有200个类别。

有更好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

你可以改用JOIN,找到那些没有匹配的东西。

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

答案 1 :(得分:1)

尝试这种方式:

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

答案 2 :(得分:0)

你可以采用这种方法,并使用EXPLAIN检查你和我的执行计划,正如Mark Ba​​ker建议的那样:

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

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