我的数据库中有一个“投票”表,它每天都在增长,目前大约有1亿行。对于内部分析/洞察,我曾经有一个rake任务,可以计算一些基本指标,比如过去几天每天的投票数。只是在“创建日期”的where子句计数。
在我删除“created_at”上的索引之前,rake任务一直运行得很好,因为它似乎对所有其他不需要此索引的面向用户的查询(尤其是插入新行时)的应用程序性能产生了负面影响。
目前我对我的应用程序和此表中的内容没有太多的见解。不过,如果这么大的表只供我自己使用,我真的不想在它上添加索引。
我还能试什么?
最佳答案
或者,您可以完全避开Vote
表并保持外部记录。
每次投票时,都会调用一个单独的计数类,该类保存投票的连续计数。每天会有一个理货记录。计票记录将有一个整数,代表当天的投票数。
对tally类的每次增量调用都会找到当前日期(今天)的tally记录,增加投票计数,并保存记录。如果不存在记录,则将创建一个并相应地递增。
例如,让我们有一个名为VoteTally
的类,它有两个属性:日期(date)和投票计数(integer),没有时间戳,没有关联。下面是模型的外观:
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
然后,在
Vote
模型中: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/