前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

原创
作者头像
网络技术联盟站
发布2023-06-08 09:35:39
9140
发布2023-06-08 09:35:39
举报

在 MySQL 中,COUNT 函数是一个非常常用的聚合函数,它用于计算某列或某表达式在查询结果中出现的次数。但是,在实际使用过程中,我们可能会遇到不同的 COUNT 函数写法,比如 COUNT(*)COUNT(主键id)COUNT(字段)COUNT(1),这些写法在效率上有何差别呢?本文将详细探讨这个问题。

COUNT(*) 与 COUNT(主键id)

首先,我们来看 COUNT(*)COUNT(主键id) 这两个写法的区别。它们都可以用来计算查询结果集中记录的数量,但是,它们的语义是不相同的。

COUNT(*) 表示计算所有行数,而 COUNT(主键id) 表示计算主键(即唯一标识一条记录的字段)不为 NULL 的记录数。这里需要注意的是,如果主键是一个自增长列,那么 COUNT(*)COUNT(主键id) 得到的结果是相同的,因为自增长列的值必定不为 NULL。

那么,这两种写法的效率如何呢?其实,它们的性能基本相同,因为在执行时,MySQL 会对这两种写法进行优化。MySQL 会从内存缓存里遍历主键索引,这是一种非常高效的操作方式,而且不需要读取数据页或磁盘块。

但是,在某些特殊情况下,COUNT(*) 可能会比 COUNT(主键id) 稍微快一点,这是因为 MySQL 可以直接通过读取页头来获取表的总记录数,而不需要扫描主键索引。但需要注意的是,只有在表没有 WHERE 子句和 GROUP BY 子句时,才能使用这种优化方式。

COUNT(字段) 与 COUNT(1)

接下来,我们来看 COUNT(字段)COUNT(1) 这两个写法的区别。它们都可以用来计算查询结果集中记录的数量,但是,它们的语义是不相同的。

COUNT(字段) 表示计算该字段不为 NULL 的记录数,而 COUNT(1) 表示计算所有行数,这里需要注意的是,COUNT(1)COUNT(*) 的作用是相同的。

那么,这两种写法的效率如何呢?实际上,在大多数情况下,这两种写法的性能基本相同,因为 MySQL 对它们进行了相同的优化。MySQL 会使用索引或全表扫描统计记录数,对于单表查询的情况,索引扫描通常比全表扫描要快一些。

但是,如果在多表查询的情况下使用 COUNT(1)COUNT(字段),就需要注意它们的性能问题了。在这种情况下,MySQL 必须进行联接操作,然后再统计记录数。此时,COUNT(1) 通常比 COUNT(字段) 更快,因为 COUNT(1) 不需要读取其他数据页或磁盘块,而只需要遍历内存缓存就可以了。

除此之外,还有一个需要注意的地方,就是在某些数据库中,COUNT(字段) 可能比 COUNT(1) 更快。这是因为 COUNT(1) 是常量,在大多数情况下都不需要执行计算和类型转换,但是在某些数据库(例如 Oracle)中,COUNT(字段) 的运行会比 COUNT(1) 更快,因为这个字段已经处于缓存状态,避免了访问其他内存中的区域。

综上所述,我们可以得出以下结论:

  • 当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。
  • 在单表查询时,COUNT(1)COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。
  • 在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。
  • 在一些数据库中,COUNT(字段) 可能比 COUNT(1) 更快。

因此,在实际应用中,我们可以根据具体的情况来选择不同的写法,从而获得更好的查询性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • COUNT(*) 与 COUNT(主键id)
  • COUNT(字段) 与 COUNT(1)
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档