COUNT(*) 是不是已编入索引?

Posted

技术标签:

【中文标题】COUNT(*) 是不是已编入索引?【英文标题】:Is COUNT(*) indexed?COUNT(*) 是否已编入索引? 【发布时间】:2013-08-14 22:45:27 【问题描述】:

出于好奇,我想知道Select Count(*) from SomeTableName 是否也像Select * from SomeTableName 一样遍历数据库的所有行?

或者数据库的元数据中是否有任何其他可用的计数字段在每次添加或删除行时自行更新?该字段由前一个查询访问。

另外我想知道这两个查询中哪个更快,多少?

【问题讨论】:

db 如何跟踪计数?如果你用过滤器在哪里请求计数怎么办? count(*) 可以,select * 不行 @ArsenMkrt 那么它只会统计满足条件的数据 not a dup @Bridge,这个问题询问 count * tarverse table 与否 @bew,但它是否应该为此遍历表? 【参考方案1】:
SELECT Count(*)
FROM   SomeTableName 

将始终计算所有行。虽然(与 SELECT * 不同)它不必读取所有列,并且可以使用可用的最窄(非过滤)索引。

mysql(MyISAM 引擎)不同,它不会从元数据中检索值。

元数据中提供了行计数值,可以从sys.partitions 检索到,但它从不用于COUNT 查询,并且并不总是准确的。

【讨论】:

以上是关于COUNT(*) 是不是已编入索引?的主要内容,如果未能解决你的问题,请参考以下文章

如果我删除带有索引的 PG 表,该索引是不是仍然存在?

ORA-20000:Oracle 文本错误:DRG-10599:列未编入索引

我应该在 Oracle 中索引主键列吗

IntelliJ Maven 错误:存储库是非关联存储库,或未编入索引

索引布尔列与日期时间列的查询性能

谷歌会将 hashbang/escaped_fragment 内容的正确 URL 编入索引吗