2014-11-20 45 views
0

我們有許多個Meters,它們以給定的時間間隔讀取大量參數,並將數據(以CSV格式)上傳到MYSQL數據庫。優化Rails應用程序數據庫中的大量行

我在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行,這意味着抓取最新數據的查詢每個需要大約500ms。

我追求優化這個方法的建議。我已經爲parameter_id字段添加了一個索引,但除此之外,我並不確定要繼續執行的最佳方法...

這可能是我需要重新考慮數據庫的結構,但這似乎是最有意義的,因爲我希望能夠動態地添加新的參數(因此爲什麼我不能只是讓我的列成爲參數名稱),這似乎是Rails默認存儲數據的方式。

在此先感謝。

+0

您的數據庫模式似乎沒問題,但關係數據庫有其侷限性。你有一個很好的例子(時間序列)來使用NoSQL(例如'Cassandra'),因此我建議從那裏開始。 Cassandra也讀取CSV。 – blelump 2014-11-20 19:34:33

回答

1

如果您使用的是Rails 3並希望繼續使用關係數據庫,那麼最好的選擇是使用table partitioning

如果您使用PostgreSQL,您可以使用partitioned寶石,並檢查此slides以獲得總覽。

如果您想要使用Rails 4,由於分區gem與ActiveRecord 4不兼容,我建議您使用手動分區,例如,可以使用年份作爲分區點。

檢查此blog post關於分片和分區,並評估哪些應該最好。