优化Rails应用程序数据库中的大量行

时间:2014-11-20 19:28:04

标签: ruby-on-rails database performance caching

我们有许多米,它以给定的间隔读取多个参数,并将数据(CSV格式)上传到MYSQL数据库。

我在Rails中对此建模如下:

Meter
  has_many :parameters

Parameter
  belongs_to :meter
  has_many :readings

Reading
  belongs_to :parameter

(我使用普通外键 - meter_id和parameter_id - 来链接表格)

这对我的种子数据很有用,我在参数模型中使用self.readings.pluck(:value).latest来获取最新值并将其传递给视图。

唯一的问题是仪表每30秒上传一次数据。这意味着 - 由于目前有20个参数 - 仅仅超过一个月的数据在我的读数表中留下了超过20,000,000行,这意味着获取最新数据的查询每个大约需要500毫秒。

我正在寻求优化方法的建议。我已经在parameter_id字段中添加了一个索引,但除此之外,我还不确定最好的方法...

可能我需要重新思考我的数据库结构的方式,但这似乎最有意义,因为我希望能够动态添加新的参数(因此我不能只是让我的列参数名称)这似乎是Rails默认存储数据的方式。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果您使用Rails 3并希望继续使用关系数据库,那么最好的选择是使用table partitioning

如果您使用PostgreSQL,您可以使用partitioned gem并查看此slides以获取概述。

如果您想使用Rails 4,由于分区的gem与ActiveRecord 4不兼容,我建议您使用手动分区,例如,您可以使用年份作为分区点。

在分片和分区上检查blog post并评估最适合的方法。