我有这个问题:
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次(获取的foreach行)或者它运行了“River”表中的每一行?
我的“河”有很多记录,我喜欢有最好的表现来获得河流。
感谢。
答案 0 :(得分:2)
在大多数生产就绪的RDBMS子查询中,只对包含在结果集中的行运行,即在您的情况下只运行10次。我认为对于mysql也是如此。
修改强>
保证运行
EXPLAIN <your query>
查看查询的执行计划
答案 1 :(得分:2)
通常,计算的数据(子查询或函数)是针对重要的行计算的,这些行是返回的行,或计算结果与进一步过滤或分组相关的行。
此外,查询优化器可能会做各种魔术,并且它不太可能多次运行子查询。它可以通过一次获取所有相关信息的方式进行转换。
即使它没有这样做,这一切都发生在数据库SQL引擎的相同操作中,因此执行此子选择10次的方式比执行该子选择作为单独的选择10次更快,因为SQL引擎只需要解析并准备一次,并且不会受到往返时间的影响。 从PHP执行时,一个简单的选择可能很容易花费30毫秒左右,因此快速数学表明它需要额外300毫秒才能在10行查询中使用此子选项,但这不是因为这些30ms中狮子的份额是PHP和数据库之间通信的开销。
由于上面提到的原因,这个子选择可能比连接更快,并且一个常见的误解是连接(几乎)总是更快。
所以,回到你的例子,子查询不会被River
中的所有行执行,但只会以优化的形式执行,对于Rivers 1的那10条记录, 2和3。
答案 2 :(得分:0)
select语句中的子查询每次返回一次,在样本中运行10次