标签:count 14 数据表 45 redis 计数 InnoDB 插入
count(*)
如果有个页面经常要显示交易系统的操作记录总数,如何计数?
- 如果用redis来保存这个表的总行数,可能存在一些问题,比如在数据表中插入一行数据后,准备将redis中的计数+1时,redis异常重启了,那刚刚这个+1的操作就丢失了,这个场景下是有解的,就是redis异常重启后,到数据库里单独执行一次 count(*) 来获取真实的行数,并写回到redis即可,由于异常重启不是经常出现的状况,所以这一次全表扫描的成本是可以接受的。但还有个问题是,redis所计数的值是不精确的,比如在执行新增记录逻辑时,先写数据库,再改redis计数,读的时候先读redis,再读数据表中的记录,此时可能出现:插入一行数据后,还没来得及给redis中的计数+1,就读了redis中的计数和数据表中的记录。
- 所以可以将这个计数放到数据库中用单独的一张计数表进行记录。InnoDB支持崩溃后数据的恢复,不会让数据丢失,并且由于InnoDB支持事务,所以可以避免redis中的不精确问题:比如先插入数据,再更新计数,如果在这中间进行了读的操作,由于前面的更新事务还没提交,更新的操作对读操作是不可见的,所以读到的数据还是未插入前的数据。
count(1) 和 count(*)
- count(1) 会遍历整张表,但不取值,按行进行累加
- count(*) 也不取值, InnoDB 专门对其进行了优化
- 查找效率方面,两者差不多,尽量使用 count(*)
标签:count,14,数据表,45,redis,计数,InnoDB,插入 来源: https://blog.csdn.net/dl674756321/article/details/122090465
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。