帮助优化SQL查询

问题描述:

嗨,我需要一些帮助解决这个问题。 我正在使用web应用程序和数据库我使用sqlite。有人可以帮助我从一个DATABSE查询必须优化==快速=)帮助优化SQL查询

我有表X:

ID | ID_DISH | ID_INGREDIENT 
1 | 1  | 2 
2 | 1  | 3 
3 | 1  | 8 
4 | 1  | 12 

5 | 2  | 13 
6 | 2  | 5 
7 | 2  | 3 

8 | 3  | 5 
9 | 3  | 8 
10| 3  | 2 

.... ID_DISH是不同的菜肴ID,ID_INGREDIENT是其中的成分所以在我的情况菜 ID为1与IDS 2,3

在这个表中有更多然后15000行食材制成的,我的问题是::这道菜由

我需要查询这将取在这里我可以找到由我不知道添加到我的算法中的ingreedients ASC计数的菜肴ID。

examle:FOO(2,4) 将按此顺序行:

ID_DISH | count(stillMissing) 
    10 | 2 
    1 | 3  

碟ID 10具有id为2和4成分和还没有得到2个,然后是

我的查询是:

SELECT 
    t2.ID_dish, 
    (SELECT COUNT(*) as c FROM dishIngredient as t1 
    WHERE t1.ID_ingredient NOT IN (2,4) 
    AND t1.ID_dish = t2.ID_dish 
    GROUP BY ID_dish) as c 
FROM dishIngredient as t2 
WHERE t2.ID_ingredient IN (2,4) 
GROUP BY t2.ID_dish 
ORDER BY c ASC 

的作品,但它是缓慢....

+10

+1发明了 'optimazing'。哪个国际海事组织应该表示“执行惊人的优化”。 – karim79 2011-01-06 20:50:38

+1

你在该表上添加了什么索引? – zsong 2011-01-06 21:17:01

select ID_DISH, sum(ID_INGREDIENT not in (2, 4)) stillMissing 
from x 
group by ID_DISH 
having stillMissing != count(*) 
order by stillMissing 

这是解决方案,我以前的查询工作5 - 20年代这项工作80ms左右

这是从MEM ory,因为我不知道sqlite的SQL方言。

SELECT DISTINCT T1.ID_DISH, COUNT(T1.ID_INGREDIENT) as COUNT 
FROM dishIngredient as T1 LEFT JOIN dishIngredient as T2 
ON T1.ID_DISH = T2.ID_DISH 
WHERE T2.ID_INGREDIENT IN (2,4) 
GROUP BY T1.ID_DISH 
ORDER BY T1.ID_DISH