有一个需求,对于一个公司信息,可能包括许多关联表,例如公司业绩,公司人员,公司变更记录等等大概有二三十个,但是需要查询公司记录的时候将所有关联表的数量展现出来,类似于下图
有一个需求,对于一个公司信息,可能包括许多关联表,例如公司业绩,公司人员,公司变更记录等等大概有二三十个,但是需要查询公司记录的时候将所有关联表的数量展现出来
- 直接count数据,这显然不行,在 MySQL 的count 接近于O(N)时间复杂度了,并且还是几十个表,所以这个方案直接 pass
- explain 命令查询近似值,但是在竞品的总值是精确的,所以也 pass
- 记录额外数据,动态维护
在公司表增加字段,优点:查询方便,不需要额外再查找;缺点:表结构耦合度增加
使用额外表记录数量,优点:降低耦合度;缺点:需要额外查一次
使用 Redis 存储数量,优点:查询和维护都很快速;缺点:会浪费 Redis 宝贵的内存 - 最终方案:使用 Redis 缓存数据,设置过期时间,防止大量 Key 堆积;并定时持久化到数据库当中
查询数量:Redis 查询,查询不到查 MySQL ,并缓存到Redis (这里MySQL不要 COUNT 数据表,因为许多根本不存在)
维护数量:Redis 没有数据查 MySQL,MySQL 有数据自增,MySQL没有数据新增一个初始值1;Redis 有数据,直接自增1
二次维护:二级列表查询详情会自带一个准确的数据,将这个数据赋值给 Redis。
因为这个数据对于用户敏感度不是很高,所以使用 Redis,并且很好利用count()恢复数据。