当前位置: 首页 > news >正文

MySQL 中 COUNT(*)、COUNT(1)、COUNT(字段) 有什么区别?

在 MySQL 中统计数据表的行数可以使用三种方式,分别是 SELECT COUNT(*)SELECT COUNT(1)SELECT COUNT(字段),那么三者之间有什么区别呢?

COUNT(*)COUNT(1) 都是对所有结果进行 COUNTCOUNT(*)COUNT(1) 本质上并没有区别(二者执行时间可能略有差别,但是它们的执行效率可以认为是相等的)。在查询语句中,如果存在 WHERE 子句,则是对所有符合筛选条件的数据行数进行统计;如果没有 WHERE 子句,则是对数据表的数据行数进行统计。

COUNT(*)COUNT(1) 虽然执行效率相等,但在 MySQL 不同存储引擎下的时间复杂度也存在区别:

  • 对于 MyISAM 存储引擎:

    如果是在 MyISAM 存储引擎下执行 COUNT(*)COUNT(1),那么统计数据表的行数只需要 O(1) 的时间复杂度,这是因为每张 MyISAM 的数据表都有一个 meta 信息存储了 row_count 值,而一致性则由表级锁来保证。

  • 对于 InnoDB 存储引擎:

    如果是 InnoDB 存储引擎,因为 InnoDB 存储引擎支持事务且采用行级锁和 MVCC 机制的特性,所以 InnoDB 存储引擎无法像 MyISAM 存储引擎一样维护一个 row_count 变量,因此 InnoDB 执行存储引擎执行 COUNT(*)COUNT(1) 需要采用扫描全表,对应的时间复杂度为 O(n),以循环加计数的方式来完成数据行数统计。

对于 COUNT(字段) 而言,在 InnoDB 存储引擎中,如果采用 COUNT(字段) 来统计数据行数,要尽量采用二级索引。这是因为聚簇索引中单个数据节点包含的数据信息要多于二级索引单个数据节点所包含的数据信息,因此如果加载相同个数的数据节点,二级索引(非聚簇索引)所占内存要比聚簇索引更少。

而对于 COUNT(*)COUNT(1) 而言,它们不需要查找具体的行,只是统计行数,系统会自动采用占用空间更小的二级索引来进行统计。如果有多个二级索引,会使用 key_len 小的二级索引进行扫描。当没有二级索引的时候,才会采用主键索引来进行统计。

相关文章:

  • WVP-GB28181摄像头管理平台存在弱口令
  • make_01_Program_02_makefile 如何判断文件在不在
  • 玩机搞机基本常识-------安卓机型ROOT 官方面具与阿尔法面具如何隐藏root权限步骤操作全程解析
  • 实践:用Ollama+DeepSeek-R1搭建AI知识库
  • LangChain集成DeepSeek实现AI对话
  • ESP826601S AT指令AT+MQTTUSERCFG报错解决方法
  • 矩阵分解中的梯度下降:详细实现方案(包含数学推导、代码实现和优化技巧)
  • 量化交易从0到1(理论篇)
  • 网络编程:自定义协议设计IO多路复用
  • cloud项目批量修改主机号
  • Linux系统安装Postgre和Postgis教程
  • 交换机与ARP
  • Java 实现二分查找:[通俗易懂的算法系列之四]
  • word导出PDF老是目录格式变化的问题
  • 包含列表的字符串数据拆分成多列
  • 数字孪生驱动医药仓库安全革命:从被动响应到主动防御的范式转型
  • 我与数学建模之终章
  • spring-ai-alibaba第九章使用Milvus构建大模型RAG应用
  • Python编码规范
  • 【2020】【论文笔记】基于二维光子晶体的光控分光比可调Y——