首页 >> 基础教程
在mysql中count(1)、count(*)、count(列名)在各种常用存储引擎中的差异?
在 MySQL 中,COUNT(1)
、COUNT(*)
和 COUNT(列名)
的性能和行为因存储引擎不同而存在显著差异,主要涉及 MyISAM 和 InnoDB 两种常用引擎。以下是详细对比:
一、MyISAM 引擎下的差异
MyISAM 引擎在磁盘上直接存储表的总行数,因此对 COUNT()
的优化极为高效:
COUNT(*)
和COUNT(1)
行为:直接返回存储的总行数,无需扫描数据。
性能:极快(时间复杂度 O(1))136。
限制:仅适用于无 WHERE 条件的查询;若带条件则退化为全表扫描。
COUNT(列名)
行为:
若列是
NOT NULL
:与COUNT(*)
行为相同,直接返回总行数(优化生效)。若列允许 NULL:需扫描全表,跳过值为
NULL
的行。性能:
NOT NULL
列:与COUNT(*)
相同(O(1))。可空列:较慢(需全表扫描)
二、InnoDB 引擎下的差异
InnoDB 因支持 MVCC(多版本并发控制),无法直接存储总行数(不同事务可见行数不同)。需扫描数据,但有优化策略:
COUNT(*)
和COUNT(1)
行为:完全等价,均统计所有可见行(含 NULL 行)。
优化:
优先遍历最小的二级索引(体积小于主键索引),减少 I/O。
若无二级索引,则扫描主键索引(聚簇索引)。
性能:高效(利用索引优化)。
COUNT(列名)
行为:仅统计该列非 NULL 值的行。
性能:
若列有索引:遍历索引(索引不存储 NULL 值),性能较好17。
若列无索引:全表扫描,性能最差。
若列定义为
NOT NULL
:无需判空,略快于可空列13。
最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30