数据库统计函数 COUNT
文章目录
- 1. COUNT 函数的作用
- 2. COUNT(*) 与 COUNT(1) 与 COUNT(column)
- 3. MySQL 对 COUNT 的优化
- 3.1 MyISAM 引擎优化
- 3.2 InnoDB 引擎优化
- 4. COUNT 查询优化
1. COUNT 函数的作用
数据库系统中 COUNT(expr)
用于统计数据行数,其主要作用为返回SELECT语句检索的行中 expr 表达式的值不为 NULL 的行的数量
,返回值是一个 BIGINT 值,如果查询结果没有命中任何记录则返回 0。通常的使用方式主要有以下两种:
- COUNT(column) 表示统计对应列有值(不为空)的数据的行数
- COUNT(*) 表示统计结果集的总行数
2. COUNT(*) 与 COUNT(1) 与 COUNT(column)
COUNT(expr)
统计的是 expr 不为 NULL的行数,而在COUNT(column)
、 COUNT(1)
和 COUNT(*)
三种用法中,expr 分别是列名
、 常量
和*
。这三个条件中常量是一个固定值,肯定不为NULL。*
可以理解为查询整行,所以肯定也不为NULL,只有列名的查询结果有可能是NULL。故 COUNT(1) 和 COUNT(*) 可认为是直接查询符合条件的数据库表的行数,而COUNT(column)表示的是查询符合条件的列的值不为NULL的行数。
- 对于COUNT(1)和COUNT(*),官方的说法是在 InnoDB 引擎中二者完全一样,不存在快慢区别
- COUNT(column)的查询则比较简单粗暴,就是进行全表扫描,然后判断指定字段的值是不是为NULL,不为NULL则累加
相比 COUNT(*),COUNT(column) 多了一个判断所查询的字段是否为 NULL 的步骤,所以效率要比 COUNT(*) 低
3. MySQL 对 COUNT 的优化
这些优化的前提都是查询语句中不包含 WHERE 及 GROUP BY 限定条件
3.1 MyISAM 引擎优化
MyISAM 引擎的锁是表级锁,同一张表上的操作都是串行完成,故MyISAM做了一个简单的优化,就是把表的总行数单独记录下来
。使用 COUNT(*) 查询表的总行数时,直接返回这个记录下来的数值就可以了,当然前提是不能有where条件
- MyISAM之所以可以把表的总行数记录下来供COUNT(*)查询使用,是因为
MyISAM数据库是表级锁,不会有并发的数据库行数修改
,所以查询得到的行数是准确的
3.2 InnoDB 引擎优化
因为 InnoDB 支持事务,其中大部分操作都是行级锁,所以表的行数可能会被并发修改,在这种情况下将总行数记录下来的方式就不准确了。因此 InnoDB 中使用 COUNT( * ) 查询行数的时候,不可避免地要进行扫表,只能在扫表过程中来优化效率
我们知道,InnoDB 中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。COUNT(*)只是为了统计总行数,不用关心查到的具体值,如果在扫表的过程中选择一个成本较低的索引的话,那就可以大大节省时间
。显而易见,非聚簇索引要比聚簇索引小很多,所以 InnoDB 引擎会优先选择最小的非聚簇索引来扫表。根据这个特性可知,建表的时候除了主键索引以外,创建一个非主键索引也很有必要
4. COUNT 查询优化
假设有一张表t_user,里面有大概5000条记录,一个需求是统计 id 大于 20 的用户数量,以下两种写法效率大不相同
简单的条件查找,近乎扫描全表,表较小时效率很高,表数据较多就很耗时
SELECTcount( * ) FROMt_user WHEREid > 20;
另一个思路是先统计 id 小于 20 的记录,再使用总的行数减去该值就得到了结果。这是因为
查询优化阶段会把该类子查询当作常数处理
,只需扫描 id < 20 的行,开销大幅减少SELECT( SELECT COUNT( * ) FROM t_user ) - count( * ) FROMt_user WHEREid < 20;
数据库统计函数 COUNT相关推荐
- Mysql数据库(十)| 合计/统计函数count
各自努力,最高处见!加油! 合计/统计函数count 一.count函数 格式 示例 二.sum函数 格式 示例 三.avg函数 格式 示例 四.Max/Min函数 格式 示例 一.count函数 返 ...
- mysql数据库 SELECT COUNT(1) FROM new_comps WHERE deleted = 0 统计数据太慢了二十多秒
@TOC使用mybatis-puls分页查询数据量大很慢,怎么处理 mysql数据库 SELECT COUNT(1) FROM new_comps WHERE deleted = 0 统计数据太慢了二 ...
- MySQL——统计函数count,合计函数sum,(avg,max,min)函数
目录 1.统计函数- count 2.合计函数-sum 3.-演示(avg,max,min)函数的使用 1.统计函数- count Count 返回行的总数 Select count( * ) I c ...
- mysql数据库中count的作用_MySQL数据库中的count的用法
1.概念 在开发系统的时候,可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,会发现随着系 ...
- 如何加减单元格指定数字_Excel非常实用的单元格数量统计函数-COUNT系列函数
▶▶点关注,不迷路.后续更精彩◀◀ 我们在工作中经常会遇到需要统计单元格个数的情况,比如:统计一列中有多少个空的单元格,有多少个非空的单元格,统计一组数据中大于某个数的单元格或小于某个数的单元格数量等 ...
- MySql数据库的count()函数
count()函数的多种用法 1 count(*) 对表行的数目进行计算,包含null; 2 count(1) 对表中第一列的值的行数进行计算.count(1)会忽略NULL列; 3 count(列名 ...
- mysql数据库中count的作用_详解 MySQL中count函数的正确使用方法
1. 描述 在MySQL中,当我们需要获取某张表中的总行数时,一般会选择使用下面的语句 select count(*) from table; 其实count函数中除了*还可以放其他参数,比如常数.主 ...
- Excel学习笔记2||求平均函数AVERAGE、AVERAGEA、AVERAGEIF、AVERAGEIFS和统计函数COUNT、COUNTA、COUNTBLANK、COUNTIF、COUNTIES
备注:该博客内容根据技术教学视频整理与总结而成,教学视频来自于office教程-龙龙老师的Excel2019视频教程合集(81节). 一.求平均值AVERAGE与AVERAGEA AVERAGE语法: ...
- 数据库中count语句解读
COUNT的几种用法 COUNT(expr),返回select语句检索行中expr的值不为NULL的数量,结果是一个BIGINT值 如果没有命中任何记录,返回0 COUNT(*)统计时会包含值为NUL ...
- 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题...
1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...
最新文章
- 3.2 神经网络表示-深度学习-Stanford吴恩达教授
- python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!
- javascript下載csv檔案
- c++学习笔记之类和对象的进阶
- 优秀程序员必备的15大技能
- Java 面向对象:构造器详解
- Android学习笔记----SQLiteDatabase 自带添加、删除、更新、查询的操作方法:实现添加,删除,更新,查询,和分页,统计
- ios html gif 显示,iOS gif图显示问题
- idea java sdk找不到指定文件路径_java-IntelliJ找不到任何声明
- 网页设计太麻烦?15款免费优质Bootstrap UI工具包助你效率倍增!
- MySQL数据库餐厅点菜系统_Java实现餐厅点餐系统的实例代码
- cad黑色背景变成白色_CAD操作记不全?看这个就够了!附上全面整理,动图教程-深圳造价培训...
- P3900 [湖南集训]图样图森破
- 中国AI监控摄像头市场现状研究分析与发展前景预测报告(2022)
- 汉高将在上海成立新的粘合剂技术创新中心;宁德时代与戴姆勒卡车扩大全球合作伙伴关系 | 美通企业日报...
- logstash(10)过滤器-dissect
- 阿里云虚拟空间No input file specified
- LDA隐狄利克雷分配
- 2017 计蒜之道 初赛 第四场 (第二题) B. 商汤科技的行人检测(简单)
- TeamTalk源码分析(三) —— 服务器端的程序架构介绍
热门文章
- 【数据库 · MySQL】听韩顺平老师课草稿
- c语言入门自学mobi,算法精解:C语言描述[AZW3][EPUB][MOBI][23.00MB]
- 间断点怎么求?——6个例子来详细解析较难的间断点的求法
- 无人驾驶技术——YOLO目标检测
- 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
- 达观数据荣获认知图谱产业建设“创新突破奖”,并与图谱知名专家共同探讨工业知识图谱应用落地
- 怎么画出好的架构图,架构师必备!
- Java动态读取map里面的key值
- Ubuntu下如何使用编译使用john-1.9.0源码
- 智能手环APP有哪些功能,具体解决方案是什么?