ruby 使用pgsql缓存时出错

2vuwiymt  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(109)

Ruby中有这样一个脚本

def self.cached_count
    @cached_count ||= begin
      table = Arel::Table.new(:pg_class)
      query = table.project(table['reltuples']).where(table['relname'].eq('receipts')).to_sql
      result = connection.exec_query query
      result&.first&.[]('reltuples')&.to_i
    end
    cach_count = ReceiptsCashe.where('id > ?', self.last.id).count
    page = cach_count % self.per_page > 0 ? 1 : 0
    @cached_count += ( cach_count / self.per_page).to_i + page
    @cached_count
  end

字符串
这将使用页面计数来显示表中的数据,并在Rails中显示页面输出。问题是该高速缓存滞后于实际数据。表的大小约为5亿条记录。我做了一个额外的表,新记录通过after_create为模型放置。并且从该数据生成最终计数器大小。但问题是,这种方法也不能很好地工作,总是有新的数据没有到达输出页面。我有这样的问题,我如何快速从一个大表中获得最后一条记录,它的id或创建日期,以便表的页数始终是最新的。

fxnxkyjh

fxnxkyjh1#

当您需要实时更新页面计数时,处理一个包含5亿条记录的表可能是一项挑战。以下是一些可以考虑的策略,以提高页面计数的性能和准确性:
1.索引:确保主表的“id”或“creation date”列(例如,“receipts”)被索引。索引将显著加快最后一条记录的检索速度。如果没有正确的索引,从这么大的表中检索最后一条记录会非常慢。
1.物化视图:考虑使用示例化视图来预先计算页数。实体化视图是查询结果的存储快照,可以定期刷新或按需刷新。您可以创建一个包含聚合页数的实体化视图,然后查询此视图以获得实时结果,而无需直接查询大型主表。
1.使用光标分页:使用游标而不是页码实现分页。使用游标,您可以根据最后看到的记录高效地检索下一组记录,而不需要每次计数记录。这可以显著提高性能,特别是对于大型表。
1.缓存更新的后台作业:不要在创建新记录时同步更新该高速缓存,而是考虑使用后台作业(例如,使用Rails中的Active Job)来定期更新缓存。您可以设置cron作业或使用作业调度程序定期更新该高速缓存,具体取决于创建新记录的频率。
1.反规范化:如果主表的大小导致了严重的性能问题,请考虑对数据进行反规范化。这意味着复制另一个表或列中的一些数据,以优化特定用例的查询性能。例如,您可以将总计数存储在单独的表中,并在创建新记录时更新此表。
1.数据存档:如果表无法控制地增长,请考虑归档或删除不再需要显示的旧数据。存档的数据可以存储在单独的表或数据库中,这将减小主表的大小,使其更易于管理。
请记住,最佳解决方案将取决于您的特定用例、更新频率和应用程序中的查询模式。您可能需要合并多种策略来实现页数更新的最佳性能。仔细测试和基准测试每种方法,以确保它满足您的需求也是至关重要的。

相关问题