gpt4 book ai didi

ruby-on-rails - 在 Rails/PostGreSQL 中对大表进行分析

转载 作者:行者123 更新时间:2023-11-29 13:34:18 28 4
gpt4 key购买 nike

我的数据库中有一个“投票”表,它的大小每天都在增长,目前大约有 1 亿行。对于内部分析/洞察,我曾经有一个 rake 任务,它会计算一些基本指标,比如过去几天每天的投票数。它只是一个在日期“created_at”上带有 where 子句的 COUNT。

在我删除“created_at”上的索引之前,此 rake 任务运行良好,因为它似乎对不需要此索引的所有其他面向用户的查询的应用程序性能产生了负面影响,尤其是在插入时一个新行。

目前,我对我的应用程序和此表中发生的事情没有太多见解。但是,如果仅供我自己使用,我真的不想在这么大的表上添加索引。

我还能尝试什么?

最佳答案

或者,您可以完全避开 Vote 表并保留外部计数。

每次投票时,都会调用一个单独的计票类来保持所投选票的运行计数。每天会有一个理货记录。计票记录将有一个整数代表当天的投票数。

对计票类的每次增量调用都会找到当前日期(今天)的计票记录,增加投票计数,并保存记录。如果不存在记录,则会创建一个并相应地递增。

例如,让我们有一个名为 VoteTally 的类,它有两个属性:日期(date)和投票计数(整数),没有时间戳,没有关联。模型如下所示:

class VoteTally < ActiveRecord::Base

def self.tally_up!
find_or_create_by_date(Date.today).increment!(:votes)
end

def self.tally_down!
find_or_create_by_date(Date.today).decrement!(:votes)
end

def self.votes_on(date)
find_by_date(date).votes
end

end

然后,在投票模型中:

class Vote < ActiveRecord::Base
after_create :tally_up
after_destroy :tally_down

# ...

private

def tally_up ; VoteTally.tally_up! ; end
def tally_down ; VoteTally.tally_down! ; end

end

这些方法将获得投票计数:

VoteTally.votes_on Date.today
VoteTally.votes_on Date.yesterday
VoteTally.votes_on 3.days.ago
VoteTally.votes_on Date.parse("5/28/13")

当然,这是一个简单的示例,您必须对其进行调整以适应。这将导致在投票期间进行额外的查询,但它比没有索引的 100M 记录的 where 子句快得多。此解决方案可能存在一些小错误,但鉴于每日投票计数的轶事性质,我认为这是可以接受的。

关于ruby-on-rails - 在 Rails/PostGreSQL 中对大表进行分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16893040/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com