《MySQL》索引篇: count(*)、count(1)和count(字段)的区别

ps:以下仅适用于 InnoDB 存储引擎

count()是什么

count(参数)是聚合函数,用来统计记录中对应参数字段不为 NULL 的记录条数。

count(字段)执行过程

  • 字段是主键时,在存储引擎中遍历索引(优先选择二级索引中最短的,没有二级索引就用聚簇索引),每次读取一条记录,交给server层,server层再读取记录中对应的字段,判断是否为 NULL,为 NULL 则变量 count 加1。

为什么要优先二级索引:因为二级索引只存储了主键值和二级索引字段,所以相同记录数,二级索引会比聚簇索引更节省空间,意味着 B+ 树更矮胖,对磁盘的 I/O 次数更少。

  • 字段是二级索引时,在存储引擎中遍历该字段的二级索引,后续流程同主键。

  • 字段是普通字段时,对全表扫描,对每条记录判断该字段是否为 NULL。

验证一:字段是主键,当表中索引只有主键索引时,使用聚簇索引。

image-20231213145800157

验证二:字段是主键,当表中索引有二级索引时,使用二级索引。

image-20231213145839591

验证三:字段是二级索引,使用该字段的二级索引。

image-20231213155119158

验证四:普通字段,全表扫描。

image-20231213150630151

count(1)

count(1) 里面是1,对于每条记录条件1 != NULL成立,不需要再读取记录中某个字段进行判断是否为 NULL,循环遍历索引(优先选择二级索引中最短的,没有二级索引就用聚簇索引),将读取的记录返回给server层,直接 count 变量加 1。因为不要查询具体字段的值,它的效率比 count(字段) 的效率高。

count(*)

使用 count(*) 时 MySQL 会把它当作 count(0) 处理。0 != NULL ,所以它的执行过程和 count(1) 是等价的。

image-20231213155622625

效率比较:count(1) = count(*) > count(索引字段) > count(普通字段)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值