首页 >> 基础教程

在mysql中count(1)、count(*)、count(列名)在各种常用存储引擎中的差异?

      在 MySQL 中,COUNT(1)COUNT(*) 和 COUNT(列名) 的性能和行为因存储引擎不同而存在显著差异,主要涉及 MyISAM 和 InnoDB 两种常用引擎。以下是详细对比:


 一、MyISAM 引擎下的差异

MyISAM 引擎在磁盘上直接存储表的总行数,因此对 COUNT() 的优化极为高效:

  1. COUNT(*) 和 COUNT(1)

    • 行为:直接返回存储的总行数,无需扫描数据。

    • 性能:极快(时间复杂度 O(1))136

    • 限制:仅适用于无 WHERE 条件的查询;若带条件则退化为全表扫描。

  2. COUNT(列名)

    • 行为:

      • 若列是 NOT NULL:与 COUNT(*) 行为相同,直接返回总行数(优化生效)。

      • 若列允许 NULL:需扫描全表,跳过值为 NULL 的行。

    • 性能:

      • NOT NULL 列:与 COUNT(*) 相同(O(1))。

      • 可空列:较慢(需全表扫描)


二、InnoDB 引擎下的差异

InnoDB 因支持 MVCC(多版本并发控制),无法直接存储总行数(不同事务可见行数不同)。需扫描数据,但有优化策略:

  1. COUNT(*) 和 COUNT(1)

    • 行为:完全等价,均统计所有可见行(含 NULL 行)。

    • 优化:

      • 优先遍历最小的二级索引(体积小于主键索引),减少 I/O。

      • 若无二级索引,则扫描主键索引(聚簇索引)。

    • 性能:高效(利用索引优化)。

  2. 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
备案号:蜀ICP备2023042032号-1