MySQL的count(*)、count(1)和count(列名)区别

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MySQL的count(*)、count(1)和count(列名)区别

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

为统计记录数,由SELECT返回。假如有如下数据:

所有记录

employee_tbl表:

id name work_date daily_typing_pages
1 John 2007-01-24 250
2 Ram 2007-05-27 220
3 Jack 2007-05-06 170
3 Jack 2007-04-06 100
4 Jill 2007-04-06 220
5 Zara 2007-06-06 300
5 Zara 2007-02-06 350

统计行的总数:

select count(*) from employee_tbl;
7

计算 Zara 的记录数

select count(*) from employee_tbl
  where name="Zara";
count(*)
2
  • count(1)、count(*)是检索表中所有记录行的数目,无论是否包含null值
  • count(1)比count(*)效率高

count(字段),检索表中的该字段的非空行数,即不统计该字段值为null的记录。

选型

永远最优选

SELECT COUNT(1) FROM tablename

尽量减少

类似:

SELECT COUNT(*) FROM tablename WHERE COL = 'value'

杜绝

SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value'
  • 若表无主键,则count(1)比count(*)
  • 若有主键,则count(主键,联合主键)比count(*)
  • 若表只有一个字段,count(*)最快

count(1)跟count(主键)一样,只扫描主键 count(*)跟count(非主键)一样,扫描整个表 明显前者更快。

执行效果

count(1) V.S count(*)

表数据量大,对表分析后,用count(1)还要比用count()用时多!

执行计划看,count(1)和count(*)效果一样。 但表做过分析后,count(1)会比count(*)的用时少些(1w以内数据量),差不太多。

若count(1)是聚合索引id,那肯定count(1)快。但差的很小。 因为count(*) 会自动优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化。

因此:count(1)和count(*)基本无差。

count(1) and count(字段)

  • count(1) 会统计表中的所有的记录数,包含字段为null 的记录
  • count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。

count(*) count(1) count(列名)

  • count(*)包括所有列,相当于行数。统计结果时,不忽略列值为NULL
  • count(1)包括了忽略所有列,1代表代码行。统计结果时,不忽略列值为NULL
  • count(列名)只包括列名那一列。统计结果时,忽略列值为空(不是指空字符串或0,而是表示null)的计数,即某个字段值为NULL时,不统计

执行效率

  • 列名为主键,count(列名)比count(1)快
  • 列名不为主键,count(1)比count(列名)快
  • 若表有多个列且无主键,count(1) 优于count(*)
  • 若有主键,则 select count(主键)的执行效率是最优的
  • 若表只有一个字段,则 select count(*)最优。

实例

create table counttest(name char(1), age char(2));
mysql> select * from counttest;
+------+------+
| name | age  |
+------+------+
| a    | 14   |
| a    | 15   |
| a    | 15   |
| b    | NULL |
| b    | 16   |
| c    | 17   |
| d    | NULL |
| e    |      |
+------+------+
8 rows in set (0.00 sec)
mysql> select name, count(name), count(1), count(*), count(age), count(distinct(age))
    -> from counttest
    -> group by name;
+------+-------------+-----------+----------+------------+-------------------+
| name | count(name) | count(1)  | count(*) | count(age) | count(distinct(age)) |
+------+-------------+-----------+----------+------------+-------------------+
| a    |           3 |         3 |        3 |          3 |                 2 |
| b    |           2 |         2 |        2 |          1 |                 1 |
| c    |           1 |         1 |        1 |          1 |                 1 |
| d    |           1 |         1 |        1 |          0 |                 0 |
| e    |           1 |         1 |        1 |          0 |                 0 |
+------+-------------+-----------+----------+------------+-------------------+
5 rows in set (0.00 sec)

MyISAM有表元数据的缓存,例如行,即COUNT(*)值,对于MyISAM表的COUNT(*)无需消耗太多资源,但对于Innodb,就没有这种元数据,CONUT(*)执行较慢。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL中的int(10)、char(10)与varchar(10)的类型和区别
在选择正确的数据类型时,需要仔细考虑每列的数据特点及应用程序的使用情况。合理的数据类型选择可以优化存储空间的使用,提高查询速度和数据库的整体性能。
534 14
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库中的 char 与 varchar的区别是什么
MySQL中的char和varchar均用于存储字符串,但有显著区别。char为定长类型,固定长度,存储空间始终为设定值,适合长度固定的数据如手机号。varchar为变长类型,仅占用实际数据所需空间,适合长度不固定的内容如用户名。二者在性能与空间利用上各有优劣,应根据实际场景合理选择。
454 0
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
259 6
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
2113 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
11月前
|
SQL Oracle 关系型数据库
MySQL 和 Oracle 的区别?
本文对比了Oracle和MySQL数据库的多个方面。Oracle适用于大型数据库,支持高并发和大访问量,市场占有率为40%,安装占用空间较大,约3G;而MySQL适合中小型应用,是开源免费的,安装仅需152M。两者在主键生成、字符串处理、SQL语句、事务处理等方面存在差异。Oracle功能更为强大,尤其在企业级应用中表现突出,而MySQL则以简单易用见长。
1339 7
MySQL 和 Oracle 的区别?
|
10月前
|
存储 关系型数据库 MySQL
MYSQL支持的存储引擎有哪些, 有什么区别
MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnerDB , 者两种存储引擎的区别 ; ● MyISAM支持256TB的数据存储 , InnerDB只支持64TB的数据存储 ● MyISAM 不支持事务 , InnerDB支持事务 ● MyISAM 不支持外键 , InnerDB支持外键
|
10月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1251 0
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
1722 12
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
253 9
|
缓存 NoSQL 关系型数据库
MySQL战记:Count( *)实现之谜与计数策略的选择
本文深入探讨了MySQL中`count(*)`的不同实现方式,特别是MyISAM和InnoDB引擎的区别,以及各种计数方法的性能比较。同时,文章分析了使用缓存系统(如Redis)与数据库保存计数的优劣,并强调了在高并发场景下保持数据一致性的挑战。
321 0
MySQL战记:Count( *)实现之谜与计数策略的选择

相关产品

  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多