MySQL的count(*), count(1), count(col_name)的区别
本文来自于:
https://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_count
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count
https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_count
目录
一、对于InnoDB
COUNT(col_name)
对于 查询结果集中的 每一行,如果 col_name 是 non-null,则加1,最后得到的数字 即为 COUNT(col_name)
COUNT(*) 和 COUNT(1)
1. 查询结果集的 行数量 即为 COUNT(*)或COUNT(1),不关心 行null 或 行non-null
2. 两者 不存在 任何的性能差距(InnoDB处理两者的方式完全一样)
MySQL 5.6, 5.7, 8.0的官方文档明确指出(之前老版本应该也是一样,但,没去翻其他版本的文档):
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
InnoDB处理 SELECT COUNT(*) 的方式
1. 5.7.18之前,InnoDB通过扫描 聚集索引(clustered index) 来处理 SELECT COUNT(*)
2. 5.7.18及以后
a. InnoDB通过遍历 可用的最小的辅助索引(secondary index) 来处理 SELECT COUNT(*)
b. 当不存在 辅助索引(secondary index)时,则通过 扫描聚集索引(clustered index) 来处理 SELECT COUNT(*)
如果索引记录并未完全装入buffer pool,处理 SELECT COUNT(*)还是需要花费点时间的,所以,如果并不需要 精确的COUNT数量,可以使用 SHOW TABLE STATUS
使用“InnoDB引擎,MySQL 5.6.23-72.1-log”来验证下
drop table if exists `test_count`;
CREATE TABLE `test_count` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`var_col1` varchar(64),
`var_col2` varchar(64),
primary key `pk_id` (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试count函数';
insert into test_count(var_col1, var_col2) values ('a1', 'b');
insert into test_count(var_col1, var_col2) values (null, 'b');
insert into test_count(var_col1, var_col2) values (null, null);
select
count(1), -- 3
count(*), -- 3
count(var_col1), -- 1
count(var_col2), -- 2
-- count(var_col1, var_col2), 语法错误
count(distinct var_col1, var_col2) -- 1。只要某个列为null,则不包括
from test_count;
SHOW TABLE STATUS where name='test_count';
二、对于MyISAM
MyISAM COUNT(*)
MyISAM 为行数量 存储了一个确切数字,所以同时满足下面条件时,SELECT COUNT(*)非常快
1. 只查询 单一一个表,且,
2. 不查询 其他列,且,
3. 不存在 WHERE 条件
例如:SELECT COUNT(*) FROM student; 非常快
MyISAM 的COUNT(1)
COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL
没看懂这是啥意思
Enjoy
推荐阅读
-
解析关于SQL语句Count的一点细节
-
sql中count或sum为条件的查询示例(sql查询count)
-
MySQL中聚合函数count的使用和性能优化技巧
-
sql server中Select count(*)和Count(1)的区别和执行方式
-
Select count(*)、Count(1)和Count(列)的区别及执行方式
-
Python字符串处理之count()方法的使用
-
Python中List.count()方法的使用教程
-
SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化
-
select count()和select count(1)的区别和执行方式讲解
-
MSSQL一个关于Count函数的小实例