您是否听说过人们说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;
实验的结果如下:
您可以看到,两个查询的结果都是相同的。但是,select count(*)
查询速度要快得多。这是因为数据库引擎能够使用索引来计数行,而select count(id)
查询必须读取表中的所有行。
结论
如果您需要计算表中的行,则最有效的方法是使用count(*)
。这将确保查询尽可能快,即使表包含大量行。