文章目录

  • 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。通常的使用方式主要有以下两种:

  1. COUNT(column) 表示统计对应列有值(不为空)的数据的行数
  2. 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 的用户数量,以下两种写法效率大不相同

  1. 简单的条件查找,近乎扫描全表,表较小时效率很高,表数据较多就很耗时

    SELECTcount( * )
    FROMt_user
    WHEREid > 20;
    
  2. 另一个思路是先统计 id 小于 20 的记录,再使用总的行数减去该值就得到了结果。这是因为查询优化阶段会把该类子查询当作常数处理,只需扫描 id < 20 的行,开销大幅减少

    SELECT( SELECT COUNT( * ) FROM t_user ) - count( * )
    FROMt_user
    WHEREid < 20;
    

数据库统计函数 COUNT相关推荐

  1. Mysql数据库(十)| 合计/统计函数count

    各自努力,最高处见!加油! 合计/统计函数count 一.count函数 格式 示例 二.sum函数 格式 示例 三.avg函数 格式 示例 四.Max/Min函数 格式 示例 一.count函数 返 ...

  2. mysql数据库 SELECT COUNT(1) FROM new_comps WHERE deleted = 0 统计数据太慢了二十多秒

    @TOC使用mybatis-puls分页查询数据量大很慢,怎么处理 mysql数据库 SELECT COUNT(1) FROM new_comps WHERE deleted = 0 统计数据太慢了二 ...

  3. MySQL——统计函数count,合计函数sum,(avg,max,min)函数

    目录 1.统计函数- count 2.合计函数-sum 3.-演示(avg,max,min)函数的使用 1.统计函数- count Count 返回行的总数 Select count( * ) I c ...

  4. mysql数据库中count的作用_MySQL数据库中的count的用法

    1.概念 在开发系统的时候,可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数.这时候你可能会想,一条select count(*) from t 语句不就解决了吗? 但是,会发现随着系 ...

  5. 如何加减单元格指定数字_Excel非常实用的单元格数量统计函数-COUNT系列函数

    ▶▶点关注,不迷路.后续更精彩◀◀ 我们在工作中经常会遇到需要统计单元格个数的情况,比如:统计一列中有多少个空的单元格,有多少个非空的单元格,统计一组数据中大于某个数的单元格或小于某个数的单元格数量等 ...

  6. MySql数据库的count()函数

    count()函数的多种用法 1 count(*) 对表行的数目进行计算,包含null; 2 count(1) 对表中第一列的值的行数进行计算.count(1)会忽略NULL列; 3 count(列名 ...

  7. mysql数据库中count的作用_详解 MySQL中count函数的正确使用方法

    1. 描述 在MySQL中,当我们需要获取某张表中的总行数时,一般会选择使用下面的语句 select count(*) from table; 其实count函数中除了*还可以放其他参数,比如常数.主 ...

  8. Excel学习笔记2||求平均函数AVERAGE、AVERAGEA、AVERAGEIF、AVERAGEIFS和统计函数COUNT、COUNTA、COUNTBLANK、COUNTIF、COUNTIES

    备注:该博客内容根据技术教学视频整理与总结而成,教学视频来自于office教程-龙龙老师的Excel2019视频教程合集(81节). 一.求平均值AVERAGE与AVERAGEA AVERAGE语法: ...

  9. 数据库中count语句解读

    COUNT的几种用法 COUNT(expr),返回select语句检索行中expr的值不为NULL的数量,结果是一个BIGINT值 如果没有命中任何记录,返回0 COUNT(*)统计时会包含值为NUL ...

  10. 关于数据库优化1——关于count(1),count(*),和count(列名)的区别,和关于表中字段顺序的问题...

    1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或者是学习中对于count()的到底怎么用更快.一直有很大的疑问,有的人说count(*)更快,也有的人说 ...

最新文章

  1. 3.2 神经网络表示-深度学习-Stanford吴恩达教授
  2. python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!
  3. javascript下載csv檔案
  4. c++学习笔记之类和对象的进阶
  5. 优秀程序员必备的15大技能
  6. Java 面向对象:构造器详解
  7. Android学习笔记----SQLiteDatabase 自带添加、删除、更新、查询的操作方法:实现添加,删除,更新,查询,和分页,统计
  8. ios html gif 显示,iOS gif图显示问题
  9. idea java sdk找不到指定文件路径_java-IntelliJ找不到任何声明
  10. 网页设计太麻烦?15款免费优质Bootstrap UI工具包助你效率倍增!
  11. MySQL数据库餐厅点菜系统_Java实现餐厅点餐系统的实例代码
  12. cad黑色背景变成白色_CAD操作记不全?看这个就够了!附上全面整理,动图教程-深圳造价培训...
  13. P3900 [湖南集训]图样图森破
  14. 中国AI监控摄像头市场现状研究分析与发展前景预测报告(2022)
  15. 汉高将在上海成立新的粘合剂技术创新中心;宁德时代与戴姆勒卡车扩大全球合作伙伴关系 | 美通企业日报...
  16. logstash(10)过滤器-dissect
  17. 阿里云虚拟空间No input file specified
  18. LDA隐狄利克雷分配
  19. 2017 计蒜之道 初赛 第四场 (第二题) B. 商汤科技的行人检测(简单)
  20. TeamTalk源码分析(三) —— 服务器端的程序架构介绍

热门文章

  1. 【数据库 · MySQL】听韩顺平老师课草稿
  2. c语言入门自学mobi,算法精解:C语言描述[AZW3][EPUB][MOBI][23.00MB]
  3. 间断点怎么求?——6个例子来详细解析较难的间断点的求法
  4. 无人驾驶技术——YOLO目标检测
  5. 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)
  6. 达观数据荣获认知图谱产业建设“创新突破奖”,并与图谱知名专家共同探讨工业知识图谱应用落地
  7. 怎么画出好的架构图,架构师必备!
  8. Java动态读取map里面的key值
  9. Ubuntu下如何使用编译使用john-1.9.0源码
  10. 智能手环APP有哪些功能,具体解决方案是什么?