count
函数主要用于统计行数,我们一般会用 count(1)
, count(*)
, count(列名)
来统计行数,但是这三者之间有什么差距呢?
异同
- 当
count(列名)
在列名不是主键列的情况下,将只统计该列的非空行数,效率也最低下; - 当
count(列名)
在列名为主键列,且在没有非聚集索引的情况下,三者都将使用主键索引来查询并统计,效率一致; - 当
count(列名)
在列名为主键列,且有非聚集索引的情况下,三者都将使用长度最小的非聚集索引来进行统计,效率一致。
总结
- 查询优化器的优化作用下,
count(1)
和count(*)
将优先使用长度最小的非聚集索引进行统计,如果没有非聚集索引,则会使用主键索引进行统计,两者的效率一致; - 当
count(列名)
在列名为主键列的情况下,count(列名)
与count(1)
和count(*)
执行流程一致,效率也一致; - 当
count(列名)
在列名不是主键列的情况下,将只统计该列的非空行数,最终会走全表扫描,效率最为低下。