【发布时间】: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