Mysql 高效地返回连接所有标记的对象
我正在运行一个基本的标记样式系统,我想知道我的查询有多高效 我的特定用例涉及通过一个Mysql 高效地返回连接所有标记的对象,mysql,sql,Mysql,Sql,我正在运行一个基本的标记样式系统,我想知道我的查询有多高效 我的特定用例涉及通过一个需求对象,用成分标记配方对象,该对象具有配方id和成分id 食谱、配料和要求都完全由用户存储 我希望能够返回一个用户的食谱,其中包括所有成分在一个给定的集合 我这样做的方式,给出了成分id的列表(1,2)和用户id的1,如下所示: SELECT `recipes`.* FROM `recipes` WHERE `recipes`.`id` IN ( SELECT `requirements`.`re
需求
对象,用成分
标记配方
对象,该对象具有配方id
和成分id
食谱、配料和要求都完全由用户存储
我希望能够返回一个用户的食谱,其中包括所有成分在一个给定的集合
我这样做的方式,给出了成分id的列表(1,2)和用户id的1,如下所示:
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的所有需求,按配方对它们进行分组,然后对它们进行计数以匹配给定的数组大小,只是为了创建一个数组来进一步查询配方id
但是需求表
可能会非常庞大,因为每个条目都管理着食谱和配料之间潜在的n平方数的双向关系。因此,以这种方式查询整个表对我来说没有意义
我错过什么了吗
我经常听说IN和NULL相等比较比连接快得多,但当子查询的复杂性否定了速度节省时,肯定不会
这似乎是一个非常简单的问题,我过度工程化了,您将如何改进它?我没有您的数据库要测试,对不起,所以我不确定这是否会产生您想要的结果。但是,可以尝试连接到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
如果您有问题,请告诉我您是否确实遇到过任何性能问题?表有多大?我还没有启动,但我对性能很感兴趣,即使是为了了解这种查询在后台是如何工作的,以及如何提高效率。