Есть две таблицы с большим количеством записей:
recipe - id, name, created
recipe2ingredient - id, recipe, ingredient
В таблице recipe стоят следующие индексы:
IC - BTREE - id, created
CI - BTREE - created, id
C - BTREE - created
В таблице recipe2ingredient следующие индексы:
R - BTREE - recipe
RI - BTREE - recipe, ingredient
Есть проблема с использованием составных индексов в следующем запросе:
SELECT r.id, COUNT(r.id) AS cnt
FROM recipe r
JOIN recipe2ingredient ri ON ri.recipe = r.id AND ri.ingredient IN (1,2)
GROUP BY r.id
ORDER BY cnt DESC, r.created DESC
LIMIT 0, 5
Запрос выполняется довольно долго ~2,5 сек.
Сама суть запроса: вытащить первые 5 рецептов, где есть максимальные совпадения с выбранными ингредиентами, а также отсортированные по дате создания.
Например, если ингредиент #1 - лук, а #2 - морковь:
Вот что выдает EXPLAIN запроса у таблицы recipe r:
id - 1
select_type - SIMPLE
table - r
type - index
possible_keys - PROMARY.C
key - C
key_len - 5
ref - NULL
rows - 4
Extra - Using index: Using temporary
у таблицы recipe2ingredient:
id - 1
select_type - SIMPLE
table - ri
type - ref
possible_keys - R
key - R
key_len - 9
ref - recipes.r.id
rows - 4
Extra - Using index
Сразу скажу, что проблемы не будет если использовать в ORDER BY и в GROUP BY одинаковые поля, например: id или created или id, created. Но мне нужно как в запросе.
Нигде не могу найти ответа, буду рад любой помощи, спасибо!
Ответ нашел в старой теме. Вывод такой, что ничего здесь уже не поделать, к сожалению. Вот ссылка: Помогите оптимизировать запрос mysql, какие индексы создать
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь сделать вывод отчетов из базы postgresql в веб-интерфейс Flask
Подскажите пожалуйста, есть код в котором при нажатии на input добавляется div элемент