在统计一个表行数的时候,我们一般会使用 select count(*) from t。那么count(*) 是如何实现的呢?
在MyISAM引擎中,会把表的总行数存在磁盘上,需要的时候,直接返回即可。但是如果是加上了where 条件,就会逐行扫描,计算行数。
在InnnoDB中,需要把数据一行行的读出来,累计计数。
因为InnoDB支持事务,由于MVCC的存在,对于返回多少行也不是很清楚,只能逐行扫描。
count() 是一个聚合函数,对于返回的结果集,逐行判断,如果不为null,则累计值加1.
推荐使用count(*), 按照效率排序的话是,count(*) 约等于 count(1) > count(主键Id) > count(字段)
对于更新频繁的数据库,可能会考虑使用缓存系统支持。但是缓存系统有可能丢失更新。另一种情况就是,缓存有可能在多个会话并发操作的时候,出现数据不一致的情况。
将表数量的计数值存放在单独的表中。
InnoDB支持崩溃恢复不丢失数据。
在T3时刻,会话A尚未提交,会话B查到的表C的计数器没有加1,而且与查询最近100条记录是对应的。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有