计数(*):计数表中排的最有效方法
#sql #database

您是否听说过人们说select(*)效率低下,因为它可以退回表中的每一列?好吧,他们是对的!但是您是否知道count(*)实际上是计算桌上所有行的最有效方法?

为什么count(*)有效?

使用count(*)时,数据库引擎将使用索引来计算行。它使用的索引称为最小的辅助索引。这意味着数据库引擎只需要读取少量数据即可计数行,这使查询非常有效。

如果我想计算特定的列怎么办?

如果要计算特定的列,则可以使用count(column_name)。但是,这将不如count(*)高效,因为数据库引擎将必须读取表中的所有行以计算包含指定列的非NULL值的行数。

概念证明

证明count star是计算行的最有效方法,让我们快速实验。我们将创建一个带有100万行的表,然后同时使用count(*)count(id)来计算行的数量。

-- Used PostgreSQL v15
CREATE TABLE my_table (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  birthday DATE NOT NULL
);

INSERT INTO my_table (name, birthday)
SELECT
  'Name' || n,
  '2000-01-01'::DATE + n * '1 day'::INTERVAL
FROM generate_series(1, 1000000) AS n;

-- Query #1
select count(*) from my_table;

-- Query #2
select count(id) from my_table;

实验的结果如下:

Query #1

Query #2

您可以看到,两个查询的结果都是相同的。但是,select count(*)查询速度要快得多。这是因为数据库引擎能够使用索引来计数行,而select count(id)查询必须读取表中的所有行。

结论

如果您需要计算表中的行,则最有效的方法是使用count(*)。这将确保查询尽可能快,即使表包含大量行。