Привет для одной из моих фотографий моделей у меня есть:
default_scope :order => 'photos.created_at DESC, photos.version DESC'
Учитывая, что я заказываю CREATED_AT и Version... Должен ли я иметь индекс DB на CREATED_AT?
Спасибо
Привет для одной из моих фотографий моделей у меня есть:
default_scope :order => 'photos.created_at DESC, photos.version DESC'
Учитывая, что я заказываю CREATED_AT и Version... Должен ли я иметь индекс DB на CREATED_AT?
Спасибо
Следующее основано на моем опыте PostgreSQL, но, вероятно, также будет применяться для MySQL и других.
Если вы планируете извлекать большое количество записей из этой таблицы или использовать разбиение на страницы, индекс в полях, используемых в ORDER BY
, был бы полезен.
Вы должны создать индекс для всех полей заказа в том же порядке. Если вы смешиваете ASC
и DESC
в ORDER BY
, вам нужно будет создать индекс с этими конкретными порядками, чтобы в полной мере использовать индекс.
Подходящая миграция ActiveRecord для вашей таблицы фотографий будет выглядеть следующим образом:
add_index :photos, [:created_at, :version]
Я бы рекомендовал посмотреть на вывод EXPLAIN ANALYZE
с данными, подобными продукту, до и после добавления индекса, чтобы подтвердить, что он имеет эффект, который вы после.
Один трюк, который может быть полезен: в типичных моделях MySql/ActiveRecord у вас будет id
как числовой первичный ключ (следовательно, неявно проиндексированный), который должен быть в том же порядке created_at
, что означает, что вы можете закажите id
вместо этого и получите быструю производительность без стоимости записи для дополнительного индекса.
Я просто читал эту последнюю ночь, когда добавлял индексы к нескольким таблицам. Краткий ответ - да'. Дело здесь довольно красноречиво сделано:
http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes
Более длинный ответ также "да", но почему бы вам не проверить его немного и посмотреть, какой пробег вы выберете из него, основываясь на том, как ваше приложение взаимодействует с данными.