首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的count(*)、count(1)和count(列名)区别

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

作者头像
JavaEdge
修改2025-07-07 17:02:31
修改2025-07-07 17:02:31
4.2K0
举报
文章被收录于专栏:JavaEdgeJavaEdge

本文已收录在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

统计行的总数:

代码语言:java
复制
select count(*) from employee_tbl;
7

计算 Zara 的记录数

代码语言:java
复制
select count(*) from employee_tbl
  where name="Zara";

count(*)
2
  • count(1)、count(*)是检索表中所有记录行的数目,无论是否包含null值
  • count(1)比count(*)效率高

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

选型

永远最优选

代码语言:sql
复制
SELECT COUNT(1) FROM tablename

尽量减少

类似:

代码语言:java
复制
SELECT COUNT(*) FROM tablename WHERE COL = 'value' 

杜绝

代码语言:java
复制
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(*)最优。

实例

代码语言:java
复制
create table counttest(name char(1), age char(2));
代码语言:java
复制
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)
代码语言:sql
复制
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(*)执行较慢。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 所有记录
  • 选型
    • 永远最优选
    • 尽量减少
    • 杜绝
  • 执行效果
    • count(1) V.S count(*)
    • count(1) and count(字段)
    • count(*) count(1) count(列名)
  • 执行效率
  • 实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档