Лучшие индексы SQL для таблицы соединения

Имея в виду улучшения производительности, я задавался вопросом, полезны ли индексы для таблицы соединения (в частности, в контексте has_and_belongs_to_many) и какие именно.

Настройка модели и таблицы

Моими моделями являются Fooи Bar, и в соответствии с соглашением rails у меня есть таблица соединений с именем bars_foos. В этой таблице нет первичного ключа или временных меток, создающих старые поля bar_id:integerи foo_id:integer. Меня интересует, какой из следующих индексов лучше и не содержит дубликатов:

  1. Составной индекс: add_index :bars_foos, [:bar_id, :foo_id]
    • Два индекса
    • A.add_index :bars_foos, :bar_id
    • B. add_index :bars_foos, :foo_id
  2. Комбинация 1 и 2-B

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

Вероятное использование

Наиболее распространенное использование будет предоставлено экземпляру модели 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, поэтому все ответы приветствуются.

38
задан Aaron 25 January 2016 в 18:25
поделиться