Как ускорить find_or_initialize в Rails?

0

в моем приложении Rails 3.2.x есть таблица под названием Pdata с в настоящее время более 1,5 миллиона записей (mysql), и она растет ежедневно. Эта таблица собирает результаты измерений и постоянно обновляется. Каждое новое измерение представляет собой либо новую запись Pdata, либо обновляет существующую. Поэтому я

pdata = Pdata.find_or_initialize_by_a_id_and_b_id_and_timestamp(a_id,b_id,timestamp)

где a и b - это в основном разные модели, к которым принадлежит каждая запись, и они доставляются данными измерений. Есть около 500 измерений в день, которые необходимо обновить или вновь создать таким образом. Теперь я узнал, что каждый вызов find_or_initialize_by занимает около 0.7 секунд! Кто-нибудь знает о более быстром способе найти или инициализировать? Кто-нибудь знает, почему этот вызов длится так долго?

Спасибо, Андреас

  • 2
    У вас есть все необходимые показатели в БД?
  • 0
    Привет, Марек, я не уверен, что понимаю твой вопрос. Я сгенерировал таблицу с помощью команды 'rails g model', вот и все, что я сделал.
Показать ещё 2 комментария
Теги:
database-performance
indexing

1 ответ

1
Лучший ответ

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

создайте миграцию, добавьте индекс с вашими полями:

def change
  add_index :p_datas, [:a_id, :b_id, :timestamp]
end

измените порядок столбцов, имея в виду правило, упомянутое ранее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню