【问题标题】:Optimising a large number of rows in a Rails app database优化 Rails 应用程序数据库中的大量行
【发布时间】:2015-01-18 19:17:06
【问题描述】:

我们有许多仪表,它们以给定的时间间隔读取多个参数,并将数据(以 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 个参数 - 仅仅一个多月的数据就在我的 Readings 表中留下了超过 20,000,000 行,这意味着获取最新的查询每个需要大约 500 毫秒。

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

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

提前致谢。

【问题讨论】:

  • 您的数据库架构似乎没问题,但关系数据库有其局限性。你有一个很好的案例(时间序列)来使用 NoSQL(例如Cassandra),因此我建议从那里开始。 Cassandra 也从 CSV 读取数据。

标签: ruby-on-rails database performance caching


【解决方案1】:

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

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

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

查看此blog post 上的分片和分区,并评估最有效的方法。

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 2018-06-20
    • 2013-06-26
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2013-06-02
    相关资源
    最近更新 更多