в моем приложении 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 секунд! Кто-нибудь знает о более быстром способе найти или инициализировать? Кто-нибудь знает, почему этот вызов длится так долго?
Спасибо, Андреас
для этого случая создайте индекс в таблице с колонками, для которых вы работаете, но имейте в виду, что порядок имеет значение, сначала используйте столбец, который будет сужать число записей быстрее.
создайте миграцию, добавьте индекс с вашими полями:
def change
add_index :p_datas, [:a_id, :b_id, :timestamp]
end
измените порядок столбцов, имея в виду правило, упомянутое ранее.