Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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,我有一个疑问: SELECT *,(SELECT count(id) FROM riverLikes WHERE riverLikes.river_id = River.id) as likeCounts FROM River WHERE user_id IN (1,2,3) LIMIT 10 我的问题是,我的子查询只运行10次(对于每一个获取的行),或者它对“River”表中的每一行都运行 我的“河流”有很多记录,我喜欢有最好的表现来获得河流 谢谢。select语句中的子

我有一个疑问:

SELECT *,(SELECT count(id) FROM riverLikes
          WHERE riverLikes.river_id = River.id) as likeCounts
FROM River
WHERE user_id IN (1,2,3)
LIMIT 10
我的问题是,我的子查询只运行10次(对于每一个获取的行),或者它对“River”表中的每一行都运行

我的“河流”有很多记录,我喜欢有最好的表现来获得河流


谢谢。

select语句中的子查询在返回的每行中运行一次,在您的示例中为10次

在大多数生产就绪的RDBMS中,子查询将仅对结果集中包含的行运行,即在您的示例中为10次。我认为mysql也是如此

编辑:

保证运行

EXPLAIN <your query>
解释

和查看查询的执行计划通常,计算数据(子查询或函数)是针对重要的行计算的,这些行是返回的行,或者计算结果与进一步筛选或分组相关的行

此外,查询优化器可能会发挥各种作用,并且不太可能多次运行子查询。它可以通过这样一种方式进行转换,即一次获取所有相关信息

即使它没有这样做,这一切都发生在数据库SQL引擎中的同一个操作中,因此执行此子选择10次要比将该子选择作为单独的选择执行10次快得多,因为SQL引擎只需对其进行一次解析和准备,并且不会出现往返时间。 从PHP执行这样一个简单的select很容易需要30毫秒左右,因此quick math建议在10行查询中使用此子select需要额外300毫秒,但事实并非如此,因为这30毫秒中的大部分是PHP和数据库之间的通信开销

由于上述原因,此子选择可能比连接快得多,并且通常错误地认为连接(几乎)总是更快


因此,回到您的示例,子查询不会对
河流中的所有行执行,而只会对河流1、2和3的10条记录执行,可能是以优化的形式执行。

子查询必须只有一个结果。@MarkusZeller取决于它们的使用位置。这些行(计算字段)不能超过一行,但可以是零行。由于这是一个
count()
查询,因此它将始终返回一行。我不是MySQL用户,但我认为连接会更好。如果答案是“每行运行”会怎么样?这应该只运行10次,您还可以将其转换为连接以使其更具可读性。使用Explain应该会告诉你哪个更快。尚未测试它是否正确,因此不想添加为应答检查以下链接,对如何优化子查询提出一些建议将其添加为联接,通常对
解释
效果更好。我也应该在我的回答中加上这一点。