对于MySQL的innodb存储引擎,‘select count(*) ’、‘select count(id)’、‘select count(1) ’这三个sql有什么区别?
让我们重新审视那三个查询在 InnoDB 存储引擎中的行为:
-
select count(*) from table;
这个查询用于计算表中的所有行数。当使用
count(*)
时,MySQL 不会去检查列的值,它只关心行数。对于 InnoDB,这并不意味着它可以从某个内部计数器快速获取行数,而是需要对整个表或满足查询条件的相关部分进行扫描。 -
select count(id) from table;
这个查询计算具有非 NULL
id
值的行数。如果id
列是定义为 NOT NULL 的,那么这个查询的结果与count(*)
会相同。但是,这个查询的意图是计算特定列的非 NULL 值的数量,所以它会检查id
列的每一行来确定其值是否为 NULL。与count(*)
类似,除非有适当的索引,否则这可能需要扫描整个表或查询条件的相关部分。 -
select count(1) from table;
这个查询在功能上与
count(*)
相同。它的目的是计算表中的行数,而不考虑任何特定列的值。count(1)
本质上是对每一行计数,不关心任何列的具体值。
总结:
- 对于 InnoDB 存储引擎,以上三种查询可能都需要扫描表的整个内容或其相应的部分(除非有适当的索引来帮助优化查询),因为 InnoDB 不维护一个预存储的行数计数器。
- 如果你只关心表中的行数,
select count(*) from table
和select count(1) from table
在语义上是等价的,你可以选择其中之一。 - 如果你关心特定列中的非 NULL 值数量,那么
select count(column_name) from table
是合适的选择。
对于性能考虑,总是建议在实际的环境和数据集上进行基准测试。