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