Должен ли я индексировать полиморфную ассоциацию ActiveRecord? - PullRequest
10 голосов
/ 21 октября 2010

У меня есть метрическая таблица, которая, как я ожидаю, будет очень большой.Он имеет полиморфную ассоциацию, так что он может принадлежать другим моделям, которые хотят записать некоторую метрику.Я обычно индексирую столбцы ассоциации, как это, чтобы ускорить загрузку ассоциации. Я слышал, как люди говорили о совместной индексации этой ассоциации .Это выглядит так:

add_index :comments, [:commentable_type, :commentable_id]

Но я также слышал совет против создания индексов с низким количеством элементов , потому что отдача индекса не компенсируетсянакладные расходы на его содержание.Поскольку половина _type моей полиморфной ассоциации, вероятно, будет иметь только 4-5 значений в миллионах строк, я склонен индексировать только часть _id полиморфной ассоциации.Я, вероятно, создам несколько дополнительных индексов соединений, используя столбец _id и некоторые другие безымянные столбцы целого числа и даты и времени, но я также не буду включать _type в эти индексы.

Это то, что вы хотели бы сделать / рекомендовать?

Ответы [ 2 ]

5 голосов
/ 21 октября 2010

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

Однако вы не создаете индекс для поля с несколькими значениями. Индекс находится в комбинации двух полей, которая, вероятно, будет иметь лот комбинаций различных значений. Индекс по объединенным полям - разумная идея.

3 голосов
/ 02 апреля 2014

Рекомендуется ставить наиболее селективное поле первым при создании индекса для нескольких полей. Поскольку у вас есть только 4-5 значений commentable_type, вам лучше сделать:

add_index :comments, [:commentable_id, :commentable_type]
...