首页 > 数据库 > MySQL > 正文

MySQL中聚合函数count的使用和性能优化技巧

2024-07-24 12:50:09
字体:
来源:转载
供稿:网友

本文的环境是Windows 10,MySQL版本是5.7.12-log

一、 基本使用

count的基本作用是有两个:

统计某个列的数据的数量; 统计结果集的行数;

用来获取满足条件的数据的数量。但是其中有一些与使用中印象不同的情况,比如当count作用一列、多列、以及使用*来表达整行产生的效果是不同的。

示例表如下:

CREATE TABLE `NewTable` (`id` int(11) NULL DEFAULT NULL ,`name` varchar(30) NULL DEFAULT NULL ,`country` varchar(50) NULL DEFAULT NULL ,`province` varchar(30) NULL DEFAULT NULL ,`city` varchar(30) NULL DEFAULT NULL )ENGINE=InnoDB

这里写图片描述

1.1 不计算NULL的值

如果有NULL值,在返回的结果中会被过滤掉

select count(country) from person;

返回结果如下:

这里写图片描述

如果满足条件的数据项不存在,则结构返回0,经常通过这种方式判断是否有满足条件的数据存在;返回的数据类型是bigint。

1.2 对count(*)的处理

count(*)的处理是有点不同的,它会返回所有数据的数量,但是不会过滤其中的NULL值,它也并不是相当于展开成所有的列,而是直接会忽略所有的列而直接统计所有的行数。语句如下:

select count(*) from person;

返回结果如下:

这里写图片描述

当想要返回所有的数据的数量的时候,但是又不想包括全部是NULL的列,使用count(*)是不可能做到的,但是在1.1中说到count作用于列的时候会过滤NULL,那么直接这么写是不是对?

select count(id, `name`, country, province, city) from person;

那就错了,count只能作用于单列,不能作用于多列 ,所以上面的写法是错误的。

另外针对count(*)语句,在MyISAM存储引擎中做了优化,每个表的数据行数都会存储在存储引擎中,可以很快拿到;但是在事务性的存储引擎中,比如InnoDB中,因为会涉及到多个事务;

1.3 对count(distinct …)的处理

count(distinct …)会返回彼此不同但是非NULL的数据的行数。这一点和只使用distinct是有区别的,因为distinct是不过滤NULL值的,详见MySQL中distinct的使用方法 。

- 如果没有符合条件的数据则返回0;
- 该语句可以作用于多列,是当各个列之间有一个不同,就认为整行数据不同,与distinct作用于多列时效果相同;

select count(DISTINCT country) from person;

返回结果如下:

这里写图片描述

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表