COUNT(1)
和 COUNT(*)
表示的是直接查询符合条件的数据库表的行数。而COUNT(列名)
表示的是查询符合条件的列的值不为NULL的行数。
COUNT(*)
是SQL92定义的标准统计行数的语法,所以MySQL对他进行了很多优化,在MySQL中比较常用的执行引擎有InnoDB和MyISAM,而MyISAM中会直接把表的总行数单独记录下来供COUNT(*)
查询,InnoDB则会在扫表的时候选择最小的索引来降低成本。当然,这些优化的前提都是没有进行where和group的条件查询。- 在InnoDB中
COUNT(*)
和COUNT(1)
实现上没有区别,而且效率一样,但是COUNT(字段)
需要进行字段的非NULL判断,所以效率会低一些。 COUNT(*)
是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)
查询表的行数!