использование составных индексов

102
29 августа 2019, 05:10

Есть две таблицы с большим количеством записей:

  1. recipe - id, name, created
  2. 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 - морковь:

  • Рецепт 881 - лук, морковь, картофель (10 января 2019)
  • Рецепт 945 - лук, морковь, картофель (8 января 2019)
  • Рецепт 567 - морковь, репа, картофель (12 января 2019)
  • Рецепт 113 - репа, картофель (13 января)
  • Рецепт 456 - картофель (11 января)

Вот что выдает 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. Но мне нужно как в запросе.

Нигде не могу найти ответа, буду рад любой помощи, спасибо!

Answer 1

Ответ нашел в старой теме. Вывод такой, что ничего здесь уже не поделать, к сожалению. Вот ссылка: Помогите оптимизировать запрос mysql, какие индексы создать

READ ALSO
Ссылка на изображение в Flask

Ссылка на изображение в Flask

Пытаюсь сделать вывод отчетов из базы postgresql в веб-интерфейс Flask

185
Добавление js элементов

Добавление js элементов

Подскажите пожалуйста, есть код в котором при нажатии на input добавляется div элемент

112