关于 MySQL 百万数据量的 count(*) 查询如何优化?

本文探讨了在不同需求场景下,如何优化MySQL中针对百万数据量的count(*)查询。对于准确性要求不高的情况,可使用缓存如Guava或Redis;对于准确性要求高的场景,建议使用计数表配合事务;对于复杂查询条件,可以通过加索引和业务拆分来优化。在性能比较中,count(*)通常是一个不错的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

明确需求

对这个问题有兴趣是源于一次开发中遇到要统计人数的需求。类似于“得到”专栏的订阅数。

但是我的数据量比这个大很多,而对数据的准确性要求就不那么高。所以首先要明确需求。其他答案有的说了用缓存,有的答案对比了count(*)、count(1)的区别,都很好,但是我认为还是要看一下题主的场景。我根据我实际开发的经验总结如下几个方面,FYI。

数据量大/准确性要求低/请求量大

  1. 这种场景一般是C端产品,比如上面说的得到APP的订阅数目,如果对一致性要求不高,可以直接在内存中使用缓存,用guava在内存中做一个缓存定时刷新即可,百万量级count(*)有缓存的频率还不至于有啥性能问题;
  2. 但是内存内缓存有一个问题就是不同服务器之间的缓存数量是不一致的,可以考虑用redis作为计数,一般这种场景是大多数同学遇到的,简单粗暴搞定即可;
  3. 用show table status。这个建议还是不要用了,翻了下mysql 的doc,40%的误差概率,碰上就有点大了呀。

TABLE_ROWS
The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40% to 50%. In s

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值