mysql中count(*)和count(1)和count(column)区别

在日常的mysql使用中,我们经常会看到SELECT COUNT(*)、SELECT COUNT(1)等查询语句,他们到底有什么区别呢?今天我就来总结下。

我们先从函数的含义说起:

  1. count(*) 统计满足查询条件的结果集的总行数(包含null)
  2. count(1) 统计满足查询条件的结果集的总行数(包含null)
  3. count(column) 如果列定义时允许为NULL,那么统计满足查询条件的不为null的总行数

count(1)中的1指的是:定义为NOT NULL的第一列。

由于innodb不能像MyISAM那样记录表的总行数,所以为了方便统计行数,MySQL 5.7.18后innodb对count(*)进行了优化:
原则:
基于占用空间最小的索引进行统计(减少磁盘IO)
操作:
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官方文档:
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count

发布了477 篇原创文章 · 获赞 588 · 访问量 267万+

猜你喜欢

转载自blog.csdn.net/qq_15037231/article/details/103074947
今日推荐