2014-02-26 58 views
0

我正在運行一個基本的標籤式系統,並且想知道我的查詢效率如何。有效返回加入所有標籤的對象

我的具體用例涉及通過requirement對象,它具有一個recipe_idingredient_id標記recipe對象與ingredients

食譜,配料和要求都完全由user

我希望能夠返回包含給定集合中所有成分的用戶食譜。

給出的ingredient_ids(1,2)user_id列表我這樣做的方式,是這樣的:

SELECT `recipes`.* FROM `recipes` 
    WHERE `recipes`.`id` IN (
    SELECT `requirements`.`recipe_id` 
     FROM `requirements` 
     WHERE `requirements`.`ingredient_id` IN (1, 2) 
     AND `requirements`.`user_id` = 1 
     GROUP BY `requirements`.`recipe_id` 
     HAVING COUNT(`requirements`.`recipe_id`) = 2) 

這回我所需要的數據,但我擔心它的表現。子查詢看起來不太好,因爲它抓取所有需要的成分_id 1或2,按配方對它們進行分組,然後對它們進行計數以匹配給定的數組大小,只需創建一個數組,以便進一步查詢recipeid。

requirements表格可能很大,因爲每個條目管理食譜和配料之間潛在的n方形數量的雙向關係之一。所以用這種方式查詢整個表格是沒有意義的。

我錯過了什麼嗎?

我經常聽說IN和NULL等值比較比JOIN快得多,但當子查詢的複雜性否定速度節省時肯定不會。

這似乎是一個非常簡單的問題,我是過度工程,你會如何改進它?

+0

你有沒有真正經歷過任何性能問題?桌子有多大? –

+0

我還沒有推出,但我對性能感興趣,即使爲了理解這種查詢如何在引擎蓋下工作以及如何使它更有效。 –

回答

0

我沒有數據庫來測試,對不起,所以我不知道這是否會產生你想要的結果。但也許嘗試加入到requirements表而不是使用子查詢,它將避免潛在的性能損失,並只是爲通常更乾淨的代碼。下面是我希望什麼會爲你工作:

SELECT `recipes`.`recipe_id` 
FROM `recipes` AS rec 
JOIN `requirements` AS req ON rec.`recipe_id` = req.`recipe_id` 
WHERE `requirements`.`ingredient_id` IN (1, 2) 
AND `requirements`.`user_id` = 1 
GROUP BY `recipes`.`recipe_id` 
HAVING COUNT(`requirements`.`ingredient_id`) = 2 

如果你有問題,讓我知道