千家信息网

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

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章主要介绍MySQL中count(字段) 、count(主键 id) 、count(1)和count(*)的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先要
千家信息网最后更新 2025年02月03日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安全错误 数据库的锁怎样保障安全 银行数据服务器一般在哪里 软件开发游戏开发课程 长沙系统软件开发服务 软件开发 游戏开发 sybase数据库端口 大专网络技术是什么意思 公益网络安全宣传证书 分析一个数据库哪些需要显示 Dell服务器带外管理配置 淄博在线学习软件开发价格 我的世界的2b2t服务器编号 计算机数据库安全性 公司服务器如何上网 对access数据库的感想 数据库技术及应用是什么意思 济南软件开发工资一般多少知乎 数据库设计网站步骤 阿里服务器分销商 重命名sql数据库名称 工信部 软件开发 价格 禁闭求生为什么进不去人家服务器 河北工业软件开发成本价 登陆id显示连接服务器出错 幽灵网络安全 大兴品牌服务器回收报价单 东莞弓叶互联网科技 asp网站连接数据库文件 我的世界服务器后台会显示什么 梅州弘润网络技术有限公司 中国国家地名数据库如何下载
0