在日常的mysql使用中,我们经常会看到SELECT COUNT(*)、SELECT COUNT(1)等查询语句,他们到底有什么区别呢?今天我就来总结下。
我们先从函数的含义说起:
- count() 统计满足查询条件的结果集的总行数(包含null),其中count(1)和count()的处理逻辑完全相同
- count(column) 如果列定义时不允许为null,那么统计满足查询条件的不为null的总行数
由于innodb不能像MyISAM那样记录表的总行数,所以为了方便统计行数,MySQL 5.7.18后innodb对count(*)进行了优化:
原则:
基于占用空间最小的索引进行统计(减少磁盘IO),如果where条件能够确定合适的辅助索引,就通过辅助索引进行数据统计。
操作:
1.如果只有聚簇索引,那么直接通过聚簇索引统计总行数。
2.因为一般情况下二级索引占用空间比聚簇索引小,所以如果存在二级索引,一般会寻找占用空间最小的二级索引进行统计。
最后说下性能:
count(*) = count(1) > count(column)
mysql文档中提到了count()和count(1)两者的统计方式完全相同,不存在任何性能差异(InnoDB handles SELECT COUNT() and SELECT COUNT(1) operations in the same way. There is no performance difference.),count(column) 会慢些,因为还需要判断列是否为null。
reference:
mysql官方文档:mysql count说明