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

标签 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 如何复制该子查询中的“计数”列。如果它为每一行发送相同的计数请求(在这种情况下为 15 次),那么在这种情况下使用组合查询是不明智的。

最佳答案

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

在第二个查询中,您要求它返回 16。您需要表格的前 15 行,并且对于每一行,您需要总行数。

这对性能的影响取决于数据库的细节。但是不,这不明智:只需提出两个查询。这就是 Django 等 ORM 处理分页的方法。

过早的优化通常不是一个好主意。如果您不确定发送 COUNT 个查询是否对您造成伤害(可能不会),请不要增加复杂性来“修复”您不知道的问题。如果您确定它伤害了您,那么衡量这两种方法的性能,看看哪一种更好。适当的性能优化(几乎肯定没有必要)是在就绪缓存中保留非规范化的行数。

关于mysql - 该子查询如何复制结果?它是否为结果中的每一行发送相同的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846292/

相关文章:

php - 登录表单安全注意事项

java - Java中数据库连接超时

mysql - 用于日期范围查询的聚簇索引与非聚簇索引

php - 上传文件并显示,但在用户提交后保存到数据库

php - 在单个 PHP 文件中连接两个数据库

mysql - 在条件下使用 GROUP BY,怎么样?

mysql - 来自具有多个 JOIN 的多个表的 SQL 查询

Hibernate @OneToOne 即使使用 @Fetch(FetchMode.JOIN) 也会执行多个查询

mysql - 使用来自 SELECT 子查询的值高效地更新查询

php - 优化MySQL近匹配查询