2014-11-20 4 views
0

У нас есть несколько счетчиков, которые считывают ряд параметров за данный интервал и загружают данные (в формате 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 параметров, данные в течение нескольких месяцев оставили мне более 20 000 000 строк в моей таблице Readings, и это означает, что запросы для захвата последних берут около 500 мс каждый.

Я после предложений о способах оптимизации этого. Я добавил индекс в поле parameter_id, но, кроме этого, я не уверен в наилучшем способе продолжения ...

Возможно, мне нужно переосмыслить, как структурирована моя база данных , но это, по-видимому, имело наибольший смысл, поскольку я хочу динамически добавлять новые параметры в линию (следовательно, почему я не мог просто сделать мои столбцы именами параметров), и это похоже на то, что Rails сохраняет данные по умолчанию ,

Заранее спасибо.

+0

Ваша схема базы данных кажется прекрасной, но реляционные базы данных имеют свои ограничения. У вас есть отличный случай (временные ряды) для использования NoSQL (например, 'Cassandra'), и поэтому я предлагаю начать с этого момента. Кассандра также читает из CSV. – blelump

ответ

1

Если вы используете Rails 3 и хотите продолжать использовать реляционную базу данных, лучшим вариантом является использование table partitioning.

Если вы используете PostgreSQL, вы можете использовать драгоценный камень partitioned и проверить это slides, чтобы получить обзор.

Если вы хотите использовать Rails 4, поскольку секционированный камень не совместим с ActiveRecord 4, я бы посоветовал использовать ручное разбиение на разделы, вы можете использовать год в качестве точки раздела, например.

Отметьте это blog post о Sharding and Partitioning и оцените, что должно работать лучше всего.