sql - 包装一个 sql 查询来做一个行计数查询是不是很好

标签 sql

给定一个任意的 sql 查询:

select foo from bar

这个sql查询可以很复杂,那么我想知道这个查询的记录大小,所以我就这样包装:
select count(*) from (select foo from bar)  t

我应该这样做吗?除了仅使用 count(*) 之外,我是否应该依靠某些索引列?

编辑:

抱歉忘了提这个:性能是我最关心的问题 .

最佳答案

COUNT(*) 是计算行数的最快方法,因为除此之外它什么都不做。

如果用 COUNT(col) 替换它,无论 col 是否被索引,dbms 都必须检查 col 中的每个值是否为空,因为空值不计算在内。所以这不能比 COUNT(*) 快。如果 col 不可为空,dbms 可能会注意到这一点并跳过空测试。然后你又回到了 COUNT(*) 所做的事情。

所以你总是使用 COUNT(*)。当您想计算非空出现的次数时,您只会使用 COUNT(col) - 或 COUNT(DISTINCT col) 来计算不同的值。

(顺便说一句:你也不会使用 COUNT(1),因为在这里你告诉 dbms 为每个记录“创建”一个 1 并测试它是否为空。嗯,1 永远不会为空,所以即使是最简单的 dbms 通常也会注意到这一点并跳过null 测试。但是为什么不首先写 COUNT(*) 呢?)

关于sql - 包装一个 sql 查询来做一个行计数查询是不是很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990217/

相关文章:

sql - 索引是否加快了两个日期时间值的 DATEDIFF 的计算?

php - 选择在任何表中出现文本的行?

Mysql - 从 3 行中的重复字段设置行的键

MySQL 在一次查询中获取 mindate 和 maxdate

php - 修改一个帖子报错,简单的php编辑表单

mysql - 2 个表之间的 SQL 查询连接产生重复结果

mysql - 左加入生效日期

sql - 简单的 sql(我希望!)

javascript - 在 sqlite 请求中使用 Group By 时选择两个结果

mysql - 选择一个表中的所有行,只要该 id 不代表第二个表中的空值