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

MySQL中 COUNT 的几种用法与性能对比

MySQL中 COUNT 的几种用法与性能对比

在日常开发中,COUNT() 是我们最常用的 SQL 聚合函数之一,用于统计数据表的记录数。但你可能听过这样的说法:

COUNT(1)COUNT(*) 快”,
“用主键比 * 更高效”。

这些说法真的成立吗?今天我们就来深入聊聊 COUNT() 的几种写法、区别和性能差异。


一、COUNT() 的基本作用

COUNT() 用于统计结果集中行的数量,但根据括号中内容不同,其含义也略有差异。

常见的几种写法如下:

写法含义是否忽略 NULL典型用途
COUNT(*)统计表中所有行数统计总行数
COUNT(字段)统计字段值不为 NULL 的行数统计某字段有值的数量
COUNT(主键)与 COUNT(*) 基本相同通常效果等价
COUNT(1)统计所有行数与 COUNT(*) 等价

二、COUNT(*):性能最优的选择

COUNT(*) 是 MySQL 官方推荐的写法。
它并不会真的取出所有字段,而是由优化器自动进行行计数,效率非常高。

✅ 优化特点:

  • 不会读取实际数据列,只统计行。
  • 优化器会自动选择最小的索引树 来遍历。
  • 对于 InnoDB 引擎,会扫描主键索引(因为数据行都存储在聚簇索引中)。
  • 对于 MyISAM 引擎,行数保存在表元数据中,COUNT(*)O(1) 操作,几乎瞬间完成。

👉 结论: COUNT(*) 性能最优,语义最清晰,是统计行数的推荐写法。


三、COUNT(主键):效果接近 COUNT(*)

主键是唯一且非空的,因此 COUNT(主键) 在结果上与 COUNT(*) 一致。
在 InnoDB 引擎下,由于主键即聚簇索引,MySQL 会遍历主键索引进行计数,性能几乎相同。

不过需要注意:

  • MySQL 对 COUNT(*) 做了更底层的优化。
  • 某些情况下,COUNT(*) 甚至能选择比主键更小的二级索引。

👉 建议: 若仅为统计行数,优先使用 COUNT(*)


四、COUNT(字段):性能略逊一筹

COUNT(字段) 只统计该字段不为 NULL 的记录。
因此在执行时,MySQL 需要额外判断字段是否为 NULL,这会带来一定的性能损耗。

例如:

SELECT COUNT(email) FROM user;

如果 email 字段不是索引列,则 MySQL 需要读取整行数据进行判断,这个过程会变慢。
若字段上有索引,MySQL 可以只扫描索引树,性能会有所提升。

👉 总结:

  • 适用于“统计字段有值的数量”;
  • 若只是想统计行数,请用 COUNT(*)

五、COUNT(1):历史遗留写法

COUNT(1) 在早期 MySQL 版本中可能略慢,因为优化器会先生成常量列再计数。
但从 MySQL 5.7 起,优化器已将 COUNT(1)COUNT(*) 视为等价写法,执行计划几乎一致。

所以:

  • 现在使用 COUNT(1)COUNT(*) 性能差别极小;
  • 但为保持语义清晰,官方仍推荐使用 COUNT(*)

六、性能对比总结

写法含义性能推荐程度备注
COUNT(*)统计所有行数✅ 最优⭐⭐⭐⭐⭐官方推荐写法
COUNT(主键)统计所有非空主键✅ 接近最优⭐⭐⭐⭐与 COUNT(*) 接近
COUNT(字段)统计字段非空行数⚠️ 一般⭐⭐会忽略 NULL,需判断字段值
COUNT(1)统计所有行数✅ 几乎最优⭐⭐⭐⭐与 COUNT(*) 等价

七、InnoDB下统计总行数的注意事项

InnoDB 不会缓存表的总行数,因此:

SELECT COUNT(*) FROM table;

仍然需要扫描索引(主键或最小索引树)完成计数。
如果表数据量非常大,统计操作会比较耗时。

优化建议:

  • 维护一个业务层的计数字段(如 Redis 缓存总数);
  • 或定期异步统计,避免频繁全表扫描。

八、结语

在现代 MySQL 中:

COUNT(*) 是最优选择,也是唯一推荐的统计行数写法。

不要再纠结 COUNT(1) 是否更快,也无需担心 COUNT(*) 会全表读取。
MySQL 优化器早已为它做了深度优化,保证了性能与准确性。

如果你要统计字段的非空数量,可以使用 COUNT(字段)
若只是要看总行数,请放心地使用 COUNT(*) —— 简洁、高效、正确。

http://www.dtcms.com/a/443423.html

相关文章:

  • 网站制作多少装修设计师一般多少钱
  • 小迪Web自用笔记52
  • 建工网站wordpress和wiki
  • 什么是网站静态化制作一款手游需要多少钱
  • C++学习:C++11介绍及其新特性学习
  • 自己做抽奖网站违法吗扁平 网站模板
  • 网站管理和维护北京丰台区
  • 怎样创作一个网站ps设计师网站
  • 四川德行天下建设工程有限公司网站ppt模板下载网站推荐
  • 织梦cms视频网站建设优购物官方网站订单查询
  • 【ROS2学习笔记】Gazebo 仿真与 XACRO 模型
  • 好看的创意网站设计怎么选择网站建设
  • 怎么做有趣的微视频网站广州电商网站建设
  • 建设银行储蓄卡余额查询系统如何做网站百度排名优化
  • 深圳网站定制公司做网站别人输账号代码
  • 银川建立网站温州网站制作企业
  • 做博客网站需要工具吗专门做设计的网站有哪些
  • php学校网站源码网页设计与制作个人网站模板
  • 管理员怎么看网站在线留言响应式手机网站模版
  • 【多线程】线程休眠(Thread Sleep)的底层实现
  • 徐州网站建设哪家好薇商城网站建设开发多少钱
  • 网站结算系统怎么做制作网页时一般需要兼容哪些浏览器
  • 郑州哪有做网站的公司各种网站
  • 贵阳网站开发多少钱黄埔做网站要多少钱
  • 尖塔游戏:二分答案
  • ps做网站分辨率自适应西安建设市场诚信信息平台网站
  • 免费提供网站建设设立公司流程以及需要的资料
  • 10.4交作业
  • 南京做网站南京乐识专心义乌做网站
  • 朋友圈营销企业整站seo