对于MySQL的innodb存储引擎,‘select count(*) ’、‘select count(id)’、‘select count(1) ’这三个sql有什么区别?

发布时间 2023-08-16 16:48:06作者: 夏威夷8080

让我们重新审视那三个查询在 InnoDB 存储引擎中的行为:

  1. select count(*) from table;

    这个查询用于计算表中的所有行数。当使用 count(*) 时,MySQL 不会去检查列的值,它只关心行数。对于 InnoDB,这并不意味着它可以从某个内部计数器快速获取行数,而是需要对整个表或满足查询条件的相关部分进行扫描。

  2. select count(id) from table;

    这个查询计算具有非 NULL id 值的行数。如果 id 列是定义为 NOT NULL 的,那么这个查询的结果与 count(*) 会相同。但是,这个查询的意图是计算特定列的非 NULL 值的数量,所以它会检查 id 列的每一行来确定其值是否为 NULL。与 count(*) 类似,除非有适当的索引,否则这可能需要扫描整个表或查询条件的相关部分。

  3. select count(1) from table;

    这个查询在功能上与 count(*) 相同。它的目的是计算表中的行数,而不考虑任何特定列的值。count(1) 本质上是对每一行计数,不关心任何列的具体值。

总结:

  • 对于 InnoDB 存储引擎,以上三种查询可能都需要扫描表的整个内容或其相应的部分(除非有适当的索引来帮助优化查询),因为 InnoDB 不维护一个预存储的行数计数器。
  • 如果你只关心表中的行数,select count(*) from tableselect count(1) from table 在语义上是等价的,你可以选择其中之一。
  • 如果你关心特定列中的非 NULL 值数量,那么 select count(column_name) from table 是合适的选择。

对于性能考虑,总是建议在实际的环境和数据集上进行基准测试。