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

本文通过实际测试对比了MySQL中count(*)、count(1)和count(列名)等不同计数函数的性能差异,并详细分析了每种计数方式的工作原理及效率高低的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有点好奇 count(*) 、count(1) 以及 count(列名) 有什么区别。便尝试查询了一下。结果如下:

准备工作:

准备一张表,我这边使用的 表 order. 大概有二十个字段,数据总量 43044 条。
存储引擎:InnoDB
数据库: Mysql

查询操作:

select COUNT(*) from app_order; 
耗时: 21 ms
结果: 43044  

select COUNT(1) from app_order; 
耗时: 21 ms
结果: 43044  

id 为主键
select COUNT(id) from app_order; 
耗时: 24 ms
结果: 43044  


outer_order_no 外部订单创建时间,普通类,有 null 值
select COUNT(outer_order_no ) from app_order; 
耗时: 43ms
结果: 17757

分析:

根据上面的结果来看,mysql InnoDB 引擎下:

  1. count(*) 和 count(1) 或者 count(0) 没有什么差别。
  2. count(主键) 效率会稍微差一点。
  3. count(普通有null值列) 效率最差 。

count(主键id ):
InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,按行累加。

count(1)
InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1” 进去,按行累加。单看这两个用法的差别的话,你能对比出来,count(1) 执行得要比 count(主键 id)快。因为从引擎 返回 id 会涉及到解析数据行,以及拷贝字段值的操作。
count(字段)

  1. 这个“字段”是定义为 not null ,一行行地从记录里面读出这个字段,按行累加;
  2. 这个“字段”定义允许为 null,那么执行的时候,判断是否是 null,不是 null 累加。

count(*) 不会把全部字段取出来,而是专门做了优化,不取值,按行累加。所以排序效率:

count(*)≈count(1)>count(id)>=count(字段)

<think>嗯,用户问的是不同计数函数或方法的区别,特别是countcount1count0这些函数。首先,我需要确认用户指的是哪些编程语言或工具中的函数,因为不同环境下可能有不同的实现。不过根据提供的引用资料,用户提到了MySQLSQL、PostgreSQL和Matlab中的count函数,所以可能他们关注的是数据库和Matlab中的计数方法。 首先,我需要回顾一下数据库中的count函数。引用1提到MySQLcount函数,除了count(1)count(*),其他用法不会考虑NULL值。引用2详细说明了SQLcount(*)count(1)count(column)的区别,而引用3则比较了PostgreSQL中的这些用法。同时,引用4介绍了Matlab中的Count函数,用于统计满足条件的元素个数。 用户提到的count0可能不是标准的函数名称,需要推测其含义。可能是指count(0)或者某种特定环境下的函数,比如Matlab中的用法?或者是用户混淆了不同术语? 接下来,我需要整理这些资料中的信息,区分不同环境下的计数函数。在SQL中,count(*)count(1)效果相同,都是统计所有行数,包括NULL值,而count(column)则忽略该列为NULL的行。而Matlab中的Count函数则是处理数组或矩阵中满足条件的元素数量,可能参数和用法不同。 用户可能混淆了不同编程环境中的函数,比如count1在数据库中可能是指count(1),而在其他语言中可能有不同含义。此外,用户提到的count0可能不存在于标准函数中,需要解释可能的情况,比如count(0)在数据库中的行为,或者是在其他编程语言中的自定义函数。 需要确保回答中覆盖不同环境下的count函数区别,明确count(*)count(1)count(列名)SQL中的差异,以及Matlab中的Count函数。同时,对于count0,可能需要指出它可能不是标准函数,或者在某些上下文中的特殊用法,例如count(0)在数据库中可能等同于count(1)count(*),但需要验证这一点。 另外,注意用户提供的引用中,PostgreSQL的引用提到count(*)count(1)效果相同,但count(1)会有额外的计算步骤,可能在性能上有细微差别,但通常可以忽略。需要将这一点纳入回答。 最后,要生成相关问题,确保问题覆盖不同数据库、编程语言以及优化和应用场景,帮助用户进一步学习。</think>### 不同计数函数或方法的区别 在编程和数据库查询中,常见的计数函数如 `count(*)`、`count(1)`、`count(列名)` 等,其行为差异主要与执行逻辑和底层优化相关。以下分环境说明: --- #### **1. 数据库中的 `count` 函数** - **`count(*)`** 统计表中所有行的数量,**包括所有列值为 `NULL` 的行**。例如,即使某一行所有字段均为 `NULL`,`count(*)` 仍会将其计入统计[^1][^2][^3]。 - **`count(1)`** 功能与 `count(*)` 相同,但实现细节略有差异。数据库会将 `1` 视为常量表达式,逐行判断并统计。理论上性能与 `count(*)` 接近,但某些数据库(如 PostgreSQL)中可能多一步计算步骤[^3]。 - **`count(列名)`** 仅统计该列**非 `NULL` 值的行数**。例如,若某行该列值为 `NULL`,则不会被计入[^2]。 --- #### **2. Matlab 中的 `count` 函数** Matlab 的 `count` 用于统计数组或矩阵中**满足特定条件的元素个数**,例如: ```matlab A = [1, 0, 3; 0, 5, 0]; count = sum(A > 0, 'all'); % 统计大于0的元素数量 ``` 此处 `count` 的结果为 `3`(元素 1、3、5)[^4]。 --- #### **3. 其他场景中的 `count0`** `count0` 并非标准函数名,可能是以下两种情况之一: 1. **自定义函数**:如统计数组中值为 `0` 的元素数量,需自行实现逻辑。 2. **误写或混淆**:可能指 `count(0)`,在数据库中与 `count(1)` 行为一致(统计所有行)。 --- ### 性能与应用建议 - **数据库场景**:优先使用 `count(*)`,因其语义明确且多数数据库已优化其性能。 - **忽略 `NULL` 时**:使用 `count(列名)`,如统计有效订单数[^2]。 - **Matlab 场景**:结合条件表达式灵活统计元素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值