千家信息网

MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先要
千家信息网最后更新 2026年11月02日MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些

这篇文章主要介绍MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

首先要弄清楚 count() 的语义。count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。

所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数"字段"不为 NULL 的总个数。

至于分析性能差别的时候,记住这么几个原则:

  • server 层要什么就给什么;

  • InnoDB 只给必要的值;

  • 现在的优化器只优化了 count(*) 的语义为"取行数",其他"显而易见"的优化并没有做。

count(可空字段)

扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加

count(非空字段)与count(主键 id)

扫描全表,读到server层,判断字段不可空,按行累加。

count(1)

扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。

注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。

count(*)

MySQL 执行count(*)在优化器做了专门优化。因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。

看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

性能对比结论

count(可空字段) < count(非空字段) = count(主键 id) < count(1) ≈ count(*)

以上是"MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

字段 一行 内容 函数 参数 性能 数据 条件 篇文章 结果 语义 语句 必要 显而易见 不能自己 个数 价值 兴趣 原则 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 互联网科技公司排名 广州淘业互联网络科技 云信互联网科技有限公司 深圳恒合互联网络科技有限公司 互联网科技保险 与互联网科技公司 唐信互联网科技 腾讯科技 互联网女皇 北京禾田雨橡互联网科技 友谊互联网络科技 厦门比较好的科技互联网公司 湖北码尼互联网科技有限公司电话 中国互联网十大科技股排名 四川慕妮娅互联网科技有限公司 互联网科技股为什么大涨 宁波跨境商互联网科技有限公司 互联网时代高科技布局 众联互联网络科技 株洲百竞科技的互联网营销顾问 亿策互联网科技 北京互联网络科技有限公司 互联网科技咨询 北京华百购互联网科技有限公司 黑科技 体验场景 互联网大会 张召忠谈中国互联网科技 山东大美朱楼互联网科技有限公司 互联网科技创业计划的风险分析 互联网科技企业文化 科技发展第三阶段互联网时代
0