那子查询如何复制结果?它是不是为结果中的每一行发送相同的请求?
Posted
技术标签:
【中文标题】那子查询如何复制结果?它是不是为结果中的每一行发送相同的请求?【英文标题】:How that subquery duplicating results ? Is it sending same request for each row in results?那子查询如何复制结果?它是否为结果中的每一行发送相同的请求? 【发布时间】:2012-01-13 05:20:20 【问题描述】:我有两个单独的查询:
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”列有 15 个相同的行。
我想知道 mysql 如何在该子查询中复制该“计数”列。如果它为每一行发送相同的计数请求(在这种情况下为 15 次),那么在这种情况下使用组合查询是不明智的。
【问题讨论】:
【参考方案1】:在第一个查询中,您向数据库服务器询问两条信息。首先,表中的前 15 行。二、表的总行数。
在第二个查询中,您要的是十六。您需要表格的前 15 行,并且对于每一行,您需要总行数。
这对性能的影响取决于数据库细节。但是不,这不明智:只需进行两个查询。这就是 Django 等 ORM 处理分页的方式。
过早的优化通常是个坏主意。如果您不确定发送 COUNT 查询是否会伤害您(可能不会),请不要增加复杂性来“修复”您不知道的问题。如果您确定它会伤害您,那么衡量这两种方法的性能,看看哪一种更好。适当的性能优化(几乎肯定没有必要)是在就绪缓存中保持非规范化的行数。
【讨论】:
大多数人建议避免在 innodb 中计数查询。以上是关于那子查询如何复制结果?它是不是为结果中的每一行发送相同的请求?的主要内容,如果未能解决你的问题,请参考以下文章
R - 对于数据框中的每一行,如何检查是不是至少有一列不是 NA? [复制]
如何使用 *CSS2* 而不是 CSS3 选择 HTML 表格中的每一行? [复制]