С улучшением производительности, мне было интересно, полезны ли и какие индексы в таблице соединений (специально используется в контексте Rails 3 has_and_belongs_to_many).
Настройка модели и таблицы
Мои модели Foo
и Bar
и для каждого соглашения rails, у меня есть таблица соединений, называемая bars_foos
. В этой таблице bar_id:integer
и foo_id:integer
нет первичного ключа или временных меток, делающих старые поля. Мне интересно узнать, какой из следующих индексов лучше и без дублирования:
- Компонентный индекс:
add_index :bars_foos, [:bar_id, :foo_id]
-
- Два индекса
- A.
add_index :bars_foos, :bar_id
- В.
add_index :bars_foos, :foo_id
- Комбинация как 1, так и 2-B
В принципе, я не уверен, достаточно ли составного индекса, если он будет полезен для начала. Я считаю, что составной индекс может использоваться как единый индекс для первого элемента, поэтому я уверен, что использование всех трех строк, несомненно, приведет к ненужному дублированию.
Вероятное использование
Наиболее часто используемым будет экземпляр модели Foo
, я буду запрашивать связанный с ним bars
с использованием синтаксиса RoR foo.bars
и наоборот с bar.foos
для экземпляра модели Bar
.
Они будут генерировать запросы типа SELECT * FROM bars_foos WHERE foo_id = ?
и SELECT * FROM bars_foos WHERE bar_id = ?
соответственно, а затем использовать эти результирующие идентификаторы для SELECT * FROM bars WHERE ID in (?)
и SELECT * FROM foos WHERE ID in (?)
.
Пожалуйста, исправьте меня в комментариях, если я ошибаюсь, но я не верю, что в контексте приложения Rails он попытается выполнить запрос, в котором он указывает оба идентификатора типа SELECT * FROM bars_foos where bar_id = ? AND foo_id = ?
.
Базы данных
В случае, если есть конкретные методы оптимизации базы данных, я, скорее всего, буду использовать PostgreSQL. Однако другие, использующие этот код, могут захотеть использовать его в MySQL или SQLite в зависимости от конфигурации Rails, поэтому все ответы будут оценены.