Двойная индексация в базе данных Rails с использованием PSQL - PullRequest
0 голосов
/ 14 мая 2019

В моем проекте Rails я хочу ускорить запросы к базе данных, обеспечив им правильную индексацию.

У меня есть модель Message со столбцами created_at, status_updated_at, message_type, direction, status, среди прочих.

В некоторых местах мне нужно выполнить запрос, такой как Query 1:

Message.where(created_at: @start_date..@end_date)
                      .where(message_type: @message_types)
                      .where(direction: 'outgoing')
                      .where(status: Message::STATUS_DELIVERED)
                      .where('status_updated_at - created_at >= ?', "90 seconds")
                      .where('status_updated_at - created_at < ?', "180 seconds")

В некоторых других местах мне нужно запросить только 1 изстолбцы, например, просто Message.where(direction: 'outgoing') (назовите это Query 2).

Для длинного запроса, Query 1, я создал эту миграцию, чтобы ускорить ее:

    add_index :messages, [:direction, :status, :created_at, :status_updated_at], name: 'dashboard_delivery_time_index'

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

add_index :messages, :direction, name: 'index_messages_on_direction'

Будет ли вторая миграция избыточной и ненужной, поскольку первая миграция уже включает :direction?

Код работает нормально.Но просто интересно, нужна ли вторая миграция.

Спасибо.

1 Ответ

1 голос
/ 14 мая 2019

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

Использует ли postgres status_updated_at и made_at из вашего индекса? Я был бы несколько удивлен, если это так. Может быть лучше индексировать направление, статус и status_updated_at - creation_at.

...