我有两个单独的查询:
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次),那么在这种情况下使用组合查询是不明智的。
答案 0 :(得分:1)
在第一个查询中,您要求数据库服务器提供两条信息。首先,表中的前15行。第二,表中的总行数。
在第二个查询中,您要求它为16。您想要表格的前15行,而每行,您需要总行数。
这对性能的影响取决于数据库的细节。但不,这不明智:只做两个查询。这就是Django这样的ORM用来处理分页。
过早优化通常是个坏主意。如果您不确定发送COUNT个查询是否会伤害您(并且可能不会),请不要添加复杂性以“修复”您不知道的问题。如果你确定它会伤害到你,那么衡量两种方法的表现,看看哪一方更优越。正确的性能优化(几乎肯定不是必需的)是在准备缓存中保持行的非规范化计数。