Mysql 之count(*)

1,226 阅读1分钟

关于MySQL中count的用法

count的官方释义:

  1. COUNT(expr)返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。
  2. 如果查询结果没有命中任何记录,则返回0
  3. 但是COUNT(*)的统计结果中,会包含值为NULL的行数。

除了在统计条数上可能存在不同,count(*)也是SQL92定义的标准统计行数的语法,同时MySQL对于count(*)也进行了优化:

InnoDB中,主键索引的叶子节点中保存的是整行的记录,而非主键索引的叶子节点中只保存的是该行记录的主键的值。

所以MySQL会优先选择最小的非主键索引来扫描,当然这个前提是sql语句需要满足以下条件:

  • 不包含where条件
  • 不包含group by条件
  • 表必须拥有一个非主键索引

如果使用count(字段)的方式搜索,不仅会进行全表扫描,使索引失去功能;还会判断指定字段的值是否为null,不为null则累加,性能大大降低!

所以在没有特殊需求的情况下,都推荐使用count(*)进行统计。

另外InnoDB也支持count(常量)的写法,效率和count(*)完全一致

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference

请参考MySql官方文档