我们有许多米,它以给定的间隔读取多个参数,并将数据(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默认存储数据的方式。
提前致谢。
答案 0 :(得分:1)
如果您使用Rails 3并希望继续使用关系数据库,那么最好的选择是使用table partitioning。
如果您使用PostgreSQL,您可以使用partitioned gem并查看此slides以获取概述。
如果您想使用Rails 4,由于分区的gem与ActiveRecord 4不兼容,我建议您使用手动分区,例如,您可以使用年份作为分区点。
在分片和分区上检查blog post并评估最适合的方法。