Как правильно указать индекс нескольких столбцов в Rails

как показано в этом вопросе: как сделать столбец уникальным и индексировать его в миграции Ruby on Rails?
Вы можете написать:

add_index :the_table, [:foo_column, :bar_column], unique: true

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

Я имею в виду что-то вроде пишу ниже код на код, приведенный выше.

add_index :the_table, :foo_column  
add_index :the_table, :bar_column

2 ответов


Для MySQL :

MySQL сможет использовать индекс [: foo_column,: bar_column] для запроса условий для обоих столбцов, а также для условий только для левого столбца, но не для правого столбца.

подробнее здесь : http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

Так что вы должны сделать

add_index :the_table, [:foo_column, :bar_column], :unique => true
add_index :the_table, :bar_column

чтобы убедиться, что вы индексируете все правильно

MySQL индексирует столбцы слева направо так если у вас есть многоколоночный индекс, как это:[:col1, :col2, :col3, :col4], вы можете запросить этот показатель на :

  • столбец col1
  • столбец col1 + столбец col2
  • столбец col1 + столбец col2 + кол3
  • столбец col1 + столбец col2 + кол3 + col4

таким образом, вы можете запросить левой колонки

Если вам нужно что-нибудь еще, вам придется создать больше индексов

опять же, это только для MySQL, postgres может работать по-другому


Для PostgreSQL:

PostgreSQL: Документация: Многоколоночные Индексы говорит:

многоколоночный индекс B-дерева можно использовать с условия запроса задействовать любое подмножество столбцов индекса, но индекс больше всего эффективен, когда есть ограничения на ведущем (крайнем левом) столбцы. точное правило заключается в том, что ограничения равенства на ведущих столбцы, плюс любые ограничения неравенства в первом столбце, которые делает не имеют ограничения равенства, будет использоваться для ограничения части индекс, который сканируется. Ограничения на столбцы справа от эти столбцы проверяются в индексе, поэтому они сохраняют посещения таблица правильная, но они не уменьшают часть индекса, который имеет для сканирования.

похоже, что PostgreSQL ведет себя так же, как MySQL в этой области.