Когда вы говорите Таблица field_instances индексируется как по form_instance_id, так и по field_id Вы имеете в виду, что существуют отдельные индексы для form_instance_id и field_id для этой таблицы?
Попробуйте сбросить индекс на form_instance_id
и поместить составной индекс на (form_instance_id, field_id)
.
Индекс работает, давая вам быстрый поиск, который говорит вам, где находятся строки, которые соответствуют вашему индексу. Затем он должен выбрать эти строки, чтобы сделать то, что вы хотите. Таким образом, вы всегда хотите, чтобы ваш индекс был как можно более конкретным. Если вы поместите два индекса в таблицу, у вас будет два разных способа поиска, но запрос, как правило, использует только один из них. Если вы поместите в таблицу индекс сцепленный , вы сможете эффективно просматривать первое поле индекса, первые два поля и т. Д. (Таким образом, объединенный индекс на (a, b)
дает вам быстрый поиск на a
, еще более быстрый поиск на a
и b
, но не помогает вам искать вещи на b
)
Прямо сейчас он выясняет все возможные вещи в form_instances
, которые имеют правильное состояние. Он отдельно вычисляет все field_instances
, которые имеют правильный идентификатор поля. Затем он присоединяется к хешу. Для этого делает поиск хеша из одного набора результатов и сканирует другой на совпадения.
С моим предложением он должен выяснить все возможные form_instances
интереса. Затем он перейдет к индексу и определит все field_instances
, которые соответствуют и экземпляру формы и идентификатору поля, и затем найдет именно те результаты, которые вас интересуют. Поскольку индекс более конкретен, в базе данных будет меньше строк данных для обработки вашего запроса.