我正在運行一個基本的標籤式系統,並且想知道我的查詢效率如何。有效返回加入所有標籤的對象
我的具體用例涉及通過requirement
對象,它具有一個recipe_id
和ingredient_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快得多,但當子查詢的複雜性否定速度節省時肯定不會。
這似乎是一個非常簡單的問題,我是過度工程,你會如何改進它?
你有沒有真正經歷過任何性能問題?桌子有多大? –
我還沒有推出,但我對性能感興趣,即使爲了理解這種查詢如何在引擎蓋下工作以及如何使它更有效。 –