Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 高效地返回连接所有标记的对象_Mysql_Sql - Fatal编程技术网

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

如果您有问题,请告诉我

您是否确实遇到过任何性能问题?表有多大?我还没有启动,但我对性能很感兴趣,即使是为了了解这种查询在后台是如何工作的,以及如何提高效率。