count(*)/count(1)/count(主键)统计效率对比

本文通过实验对比COUNT(1), COUNT(*)与COUNT(主键)及COUNT(非主键)在MySQL 5.7 InnoDB引擎下的性能差异,揭示了COUNT函数的实际执行效率,并解析不同场景下COUNT函数的行为特性。

前言

在实际业务开发中,我们常常需要count数据表的记录条数。关于使用mysql的count统计函数,大多开发者都不会有疑问,但是就使用细节上,大家的观点可能就不一致了。一派认为count(1)比count(*)要快,说count(*)要全表扫描而count(1)则不用。另一派反之。针对count(主键)和count(1)和count(*),大家几乎一致认为count(主键)效率较慢。那么实际情况是这样么?

本次就来做个总结。

测试

针对mysql5.7 innodb引擎,主键为id的表,
我们explain count(1)和count(*)以及count(id)和count(name)

explain select SQL_NO_CACHE count(1) from province
explain select SQL_NO_CACHE count(*) from province
explain select SQL_NO_CACHE count(id) from province
explain select SQL_NO_CACHE count(name) from province

然后发现前三者的执行计划一摸一样
1.png
而count(name)显然效率较低
2.png

所以我们确定count(*)和count(1)以及count(主键)的效率是一致的!
mysql底层对count()有优化,会选择最有效率的方式去执行count操作,两者没有性能差异,效率都比较高。

总结

一方面

count(主键列),count(),count(1)效率差不多!
count(非主键列)的效率往往低于count(
),count(1),count(主键列)!

另一方面

count(1),count(*)会统计表中的所有的记录数,包含字段为null 的记录;
count(列名) 会统计该字段在表中出现的次数,不统计字段为null 的记录。

请关注我的订阅号

订阅号.png

这是我的用户类,package jnpf.permission.entity; import jnpf.base.entity.SuperExtendEntity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.Date; /** * 用户信息 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司 * @date 2019年9月26日 上午9:18 */ @Data @TableName("base_user") public class UserEntity extends SuperExtendEntity.SuperExtendDEEntity<String> { /** * 账户 */ @TableField("F_ACCOUNT") private String account; /** * 姓名 */ @TableField("F_REAL_NAME") private String realName; /** * 快速查询 */ @TableField("F_QUICK_QUERY") private String quickQuery; /** * 呢称 */ @TableField("F_NICK_NAME") private String nickName; /** * 头像 */ @TableField("F_HEAD_ICON") private String headIcon; /** * 性别 */ @TableField("F_GENDER") private String gender; /** * 生日 */ @TableField("F_BIRTHDAY") private Date birthday; /** * 手机 */ @TableField("F_MOBILE_PHONE") private String mobilePhone; /** * 电话 */ @TableField("F_TELE_PHONE") private String telePhone; /** * F_Landline */ @TableField("F_LANDLINE") private String landline; /** * 邮箱 */ @TableField("F_EMAIL") private String email; /** * 民族 */ @TableField("F_NATION") private String nation; /** * 籍贯 */ @TableField("F_NATIVE_PLACE") private String nativePlace; /** * 入职日期 */ @TableField(value = "F_ENTRY_DATE") private Date entryDate; /** * 证件类型 */ @TableField("F_CERTIFICATES_TYPE") private String certificatesType; /** * 证件号码 */ @TableField("F_CERTIFICATES_NUMBER") private String certificatesNumber; /** * 文化程度 */ @TableField("F_EDUCATION") private String education; /** * F_UrgentContacts */ @TableField("F_URGENT_CONTACTS") private String urgentContacts; /** * 紧急电话 */ @TableField("F_URGENT_TELE_PHONE") private String urgentTelePhone; /** * 通讯地址 */ @TableField("F_POSTAL_ADDRESS") private String postalAddress; /** * 自我介绍 */ @TableField("F_SIGNATURE") private String signature; /** * 密码 */ @TableField("F_PASSWORD") private String password; /** * 秘钥 */ @TableField("F_SECRETKEY") private String secretkey; /** * 首次登录时间 */ @TableField("F_FIRST_LOG_TIME") private Date firstLogTime; /** * 首次登录IP */ @TableField("F_FIRST_LOG_IP") private String firstLogIp; /** * 前次登录时间 */ @TableField("F_PREV_LOG_TIME") private Date prevLogTime; /** * 前次登录IP */ @TableField("F_PREV_LOG_IP") private String prevLogIp; /** * 最后登录时间 */ @TableField("F_LAST_LOG_TIME") private Date lastLogTime; /** * 最后登录IP */ @TableField("F_LAST_LOG_IP") private String lastLogIp; /** * 登录成功次数 */ @TableField("F_LOG_SUCCESS_COUNT") private Integer logSuccessCount; /** * 登录错误次数 */ @TableField("F_LOG_ERROR_COUNT") private Integer logErrorCount; /** * 最后修改密码时间 */ @TableField("F_CHANGE_PASSWORD_DATE") private Date changePasswordDate; /** * 系统语言 */ @TableField("F_LANGUAGE") private String language; /** * 系统样式 */ @TableField("F_THEME") private String theme; /** * 常用菜单 */ @TableField("F_COMMON_MENU") private String commonMenu; /** * 是否管理员 */ @TableField("F_IS_ADMINISTRATOR") private Integer isAdministrator; /** * 扩展属性 */ @TableField("F_PROPERTY_JSON") private String propertyJson; /** * 主管主键 */ @TableField("F_MANAGER_ID") private String managerId; /** * 组织主键 */ @TableField("F_ORGANIZE_ID") private String organizeId; /** * 岗位主键 */ @TableField("F_POSITION_ID") private String positionId; /** * 角色主键 */ @TableField("F_ROLE_ID") private String roleId; /** * 门户主键 */ @TableField("F_PORTAL_ID") private String portalId; /** * 是否锁定 */ @TableField("F_LOCK_MARK") private Integer lockMark; /** * 解锁时间 */ @TableField(value = "F_UNLOCK_TIME",updateStrategy = FieldStrategy.IGNORED) private Date unlockTime; /** * 分组id */ @TableField("F_GROUP_ID") private String groupId; /** * 系统id */ @TableField("F_SYSTEM_ID") private String systemId; /** * App系统id */ @TableField("F_APP_SYSTEM_ID") private String appSystemId; /** * 钉钉工号 */ @TableField("F_DING_JOB_NUMBER") private String dingJobNumber; /** * 交接状态 */ @TableField("f_handover_mark") private Integer handoverMark; /** * 职级 */ @TableField("f_rank") private String ranks; /** * 身份 */ @TableField("F_STANDING") private Integer standing; /** * 身份 */ @TableField("F_APP_STANDING") private Integer appStanding; } 帮我写一个查询方法,入参是姓名:realName。找有没有这个人。使用mybatis-plus中的兰姆达表达式来写SQL。
最新发布
09-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值