Rails - created_at, когда пользователь заказывает, должен ли добавить индекс в таблицу?

Привет для одной из моих фотографий моделей у меня есть:

default_scope :order => 'photos.created_at DESC, photos.version DESC'

Учитывая, что я заказываю CREATED_AT и Version... Должен ли я иметь индекс DB на CREATED_AT?

Спасибо

Ответ 1

Следующее основано на моем опыте PostgreSQL, но, вероятно, также будет применяться для MySQL и других.

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

Вы должны создать индекс для всех полей заказа в том же порядке. Если вы смешиваете ASC и DESC в ORDER BY, вам нужно будет создать индекс с этими конкретными порядками, чтобы в полной мере использовать индекс.

Подходящая миграция ActiveRecord для вашей таблицы фотографий будет выглядеть следующим образом:

add_index :photos, [:created_at, :version]

Я бы рекомендовал посмотреть на вывод EXPLAIN ANALYZE с данными, подобными продукту, до и после добавления индекса, чтобы подтвердить, что он имеет эффект, который вы после.

Ответ 2

Один трюк, который может быть полезен: в типичных моделях MySql/ActiveRecord у вас будет id как числовой первичный ключ (следовательно, неявно проиндексированный), который должен быть в том же порядке created_at, что означает, что вы можете закажите id вместо этого и получите быструю производительность без стоимости записи для дополнительного индекса.

Ответ 3

Я просто читал эту последнюю ночь, когда добавлял индексы к нескольким таблицам. Краткий ответ - да'. Дело здесь довольно красноречиво сделано:

http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes

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