MySQL count(*),count(1),count(field)区别
《阿里巴巴Java开发手册》中强制要求不让使用 COUNT(列名)或 COUNT(常量)来替代 COUNT(*)
COUNT函数的用法,主要用于统计表行数。主要用法有:
count(field),如COUNT(id),不包含id字段值为NULL的记录。会进行字段的非NULL判断,所以效率会低一些。
count(*)包含NULL记录。
还可以使用COUNT(常量),如COUNT(1)来统计行数
count(*)与count(1) 在InnoDB中性能没有任何区别,处理方式相同
COUNT(*)是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化:
MyISAM中会直接把表的总行数单独记录下来供COUNT(*)查询,
InnoDB则会在扫表的时候选择最小的索引来降低成本。
当然,这些优化的前提都是没有进行where和group的条件查询。
总结:
COUNT(*)效率高,直接使用COUNT(*)查询表的行数!结果中包含NULL记录
count(field) 会对字段field进行is not null的判断,效率低,如果要查询的结果中不需要null的记录,可以使用count(field)