count(*)、count(主键 id)、count(字段) 和 count(1) 等不同用法的性能,有哪些差别?

1.先说结论

性能从高到低:count(*) > count(1) > count(主键id) > count(字段)

2.分析

count(*):MySql专门做了优化,会选择一棵最小的索引树去遍历获得行数;

count(1):在统计的时候如果扫描到一行计数就加1,性能仅次于count(*);

count(主键id):在扫描的时候server层会把id从引擎层查出来,然后计数加1,因为需要把id取出来,所以性能差一些;

count(字段):在扫描的时候server层会把字段的值从引擎层查出来,并且只统计不为null的行,跟上述三个命令执行的结果不一定一样,性能也是最差的。

总结:如果涉及到统计一个表有多少行数据的,count(*)性能是最佳的。

3.其它的方案统计表的行数

(1)通过redis来计数,但是不是最精确的,这个其实就是redis和mysql的数据一致性问题了,看业务来决定,如果对数据一致性要求不是很高的话,可以通过redis来计数,毕竟redis性能不错;

(2)增加一个专门的计数表,来统计不同表的行数,字段设计大概如下:

id,table_name,create_time,update_time,然后table_name建立唯一索引;

放在事务里面跟业务sql一起执行,这样也保证了数据的一致性,但是性能没有redis好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值