在使用MySQL进行数据统计的时候,我们经常会用到count函数来计算表中的行数。但是,你有没有想过,count函数的参数应该怎么写呢?是用count(*),还是用count(1),或者是用count(某个列名)呢?这三种写法有什么区别呢?哪一种性能最好呢?
为了回答这些问题,我们首先要了解一下count函数的含义和用法。根据MySQL官方文档1,count函数有两种作用:
-统计某个列值的数量,不包括NULL值。
-统计结果集的行数,不论列值是否为NULL。
如果在count函数的括号中指定了列名或者表达式,则统计的就是这个表达式有值(非NULL)的结果数。例如,count(id)就是统计id列不为NULL的行数。
如果在count函数的括号中使用了通配符*,则表示统计所有的行数,不管列值是否为NULL。例如,count(*)就是统计表中所有的行数。
那么,如果在count函数的括号中使用了常数呢?例如,count(1)。这种情况下,MySQL会认为这个常数是一个非NULL值的表达式,所以也会统计所有的行数。也就是说,count(1)和count(*)的效果是一样的。
那么,在MySQL中使用count(*)和count(1)有什么区别呢?哪一个更快呢?
其实,在高版本的MySQL(5.5及以后)中,这两种写法没有性能上的差别。因为MySQL对它们做了相同的优化2。无论是count(*)还是count(1),MySQL都会尽量选择最小的索引来扫描表,而不会