rails - созданный пользователем при заказе, следует ли добавить индекс в таблицу? - PullRequest
16 голосов
/ 15 декабря 2010

Здравствуйте, одна из моих фотографий моделей:

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

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

Спасибо

Ответы [ 3 ]

18 голосов
/ 15 февраля 2013

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

11 голосов
/ 15 декабря 2010

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

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

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

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

add_index :photos, [:created_at, :version]

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

10 голосов
/ 15 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...