关于MySQL中count的用法
count的官方释义:
COUNT(expr)返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。- 如果查询结果没有命中任何记录,则返回0
- 但是
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