我有两个单独的查询:
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 如何复制该子查询中的“计数”列。如果它为每一行发送相同的计数请求(在这种情况下为 15 次),那么在这种情况下使用组合查询是不明智的。
最佳答案
在第一个查询中,您向数据库服务器询问两条信息。首先,表中的前 15 行。第二,表的总行数。
在第二个查询中,您要求它返回 16。您需要表格的前 15 行,并且对于每一行,您需要总行数。
这对性能的影响取决于数据库的细节。但是不,这不明智:只需提出两个查询。这就是 Django 等 ORM 处理分页的方法。
过早的优化通常不是一个好主意。如果您不确定发送 COUNT 个查询是否对您造成伤害(可能不会),请不要增加复杂性来“修复”您不知道的问题。如果您确定它伤害了您,那么衡量这两种方法的性能,看看哪一种更好。适当的性能优化(几乎肯定没有必要)是在就绪缓存中保留非规范化的行数。
关于mysql - 该子查询如何复制结果?它是否为结果中的每一行发送相同的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846292/