Должен ли я совместно индексировать полиморфную ассоциацию ActiveRecord?

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

add_index :comments, [:commentable_type, :commentable_id]

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

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

2 ответов


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

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

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

add_index :comments, [:commentable_id, :commentable_type]