子查询如何重复结果?它是否为结果中的每一行发送相同的请求?

时间:2012-01-13 05:20:21

标签: mysql sql query-optimization subquery

我有两个单独的查询:

SELECT  `ad_general`.`id`
FROM (`ad_general`)
WHERE `ad_general`.`city` =  '708'
ORDER BY `ad_general`.`id` desc
LIMIT 15 

SELECT  count(`ad_general`.`id`) as count
FROM (`ad_general`)
WHERE `city` =  '708'

我已将这两个查询结合起来,以避免向mysql结果发送多个请求以获得性能提升。

SELECT  `ad_general`.`id`, (
 SELECT  count(`ad_general`.`id`) as count
 FROM (`ad_general`)
 WHERE `city` = 708 ) AS count,
FROM (`ad_general`)
WHERE `ad_general`.`city` =  '708'
ORDER BY `ad_general`.`id` desc
LIMIT 15 

在第一种方法中,“count”列只有一行,显然只有一个count列请求。

但在组合查询中,“count”列有15个相同的行。

我想知道mysql如何复制该子查询中的“count”列。如果它为每一行发送相同的计数请求(在这种情况下为15次),那么在这种情况下使用组合查询是不明智的。

1 个答案:

答案 0 :(得分:1)

在第一个查询中,您要求数据库服务器提供两条信息。首先,表中的前15行。第二,表中的总行数。

在第二个查询中,您要求它为16。您想要表格的前15行,而每行,您需要总行数。

这对性能的影响取决于数据库的细节。但不,这不明智:只做两个查询。这就是Django这样的ORM用来处理分页。

过早优化通常是个坏主意。如果您不确定发送COUNT个查询是否会伤害您(并且可能不会),请不要添加复杂性以“修复”您不知道的问题。如果你确定它会伤害到你,那么衡量两种方法的表现,看看哪一方更优越。正确的性能优化(几乎肯定不是必需的)是在准备缓存中保持行的非规范化计数。