Mysql count 的多种使用方式性能比较

Mysql的count函数用于统计符合条件的记录数,常用的方式有:

1count(*)
2count(1)
3count(id)
4count(col)

首先需要明确一点:count函数对于返回的结果集,一行行地判断,不会统计null值。

初学者经常会纠结到底应该使用哪种方式做计数,实际上这四种计数方式是有很大差别的。
count()的原理:

  1. count(*)
    遍历整张表,不需要取出数据来计算,直接按行累计。

  2. count(1)
    遍历整张表,不需要取数,按行计数。

  3. count(id)
    遍历整张表,取出id,按行计数。

  4. count(col)
    遍历整张表,取出col,如果字段定义不为null,取出col之后,按行计数。如果字段定义可以为null,循环对col进行判断是否为null值,再计数。

这四种计数方式遍历整张表的方式也有不同:

  1. count(*)
    会找任意较小的索引遍历,如果没有二级索引,就会直接遍历主键索引,因为主键索引包含了全表数据,所以在字段比较大的时候,可能会需要频繁去磁盘取数据,导致count() 效率低,耗时长,结局方案是给一个小字段加个二级索引,这样count() 的时候就会遍历这个二级索引,快速进行计数。
  2. count(1)
    使用索引遍历的选择和 count(*)一致。
  3. count(id)
    使用主键索引遍历
  4. count(col)
    如果col建立了二级索引,则会遍历二级索引,否则主键索引

所以,性能上排序为:count(*) > count(1) > count(id) > count(col)。

在不考虑是否对null计数得区别的前提下,性能优化的方向,除了使用count(*) 外,就是适当使用小的二级索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闲敲代码、落灯花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值