Есть две таблицы с большим количеством записей:
recipe - id, name, createdrecipe2ingredient - id, recipe, ingredientВ таблице recipe стоят следующие индексы:
IC - BTREE - id, createdCI - BTREE - created, idC - BTREE - createdВ таблице recipe2ingredient следующие индексы:
R - BTREE - recipeRI - 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, какие индексы создать
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости