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

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 中计数查询。

以上是关于那子查询如何复制结果?它是不是为结果中的每一行发送相同的请求?的主要内容,如果未能解决你的问题,请参考以下文章

oracle对表的基本操作

Kusto:将结果集中的每一行与另一个表进行比较

R - 对于数据框中的每一行,如何检查是不是至少有一列不是 NA? [复制]

如何使用 *CSS2* 而不是 CSS3 选择 HTML 表格中的每一行? [复制]

将函数应用于 data.frame 中的每一行并将结果附加到 R 中的 data.frame

如何从查询结果中将一行中的单元格设为空白?