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应该会告诉你哪个更快。尚未测试它是否正确,因此不想添加为应答检查以下链接,对如何优化子查询提出一些建议将其添加为联接,通常对解释效果更好。我也应该在我的回答中加上这一点。