Это ситуация, когда коррелированный подзапрос должен иметь лучшую производительность:
SELECT f.f_id, f.description,
fi.rank, fi.img_url AS profile_photo
FROM fav_food ff JOIN
food f
ON ff.f_id = f.f_id LEFT JOIN
food_image fi
ON fi.f_id = f.f_id AND
fi.rank = (SELECT MIN(fi2.rank) FROM food_image fi2 WHERE fi2.f_id = fi.f_id)
WHERE ff.user_id = ? ;
Для производительности вы должны быть уверены, что у вас есть индекс и для food_image(f_id, rank)
, и для fav_food(user_id, f_id)
.в качестве индексов для первичных ключей.
Почему это быстрее, чем версия GROUP BY
?Во-первых, индексы можно использовать для коррелированного запроса, но, вероятно, не для JOIN
после GROUP BY
.
Во-вторых, GROUP BY
необходимо обработать все данные в таблице изображений.Это нужно только для обработки любимых продуктов для данного пользователя.
Наконец, ROW_NUMBER()
- это опция в MySQL 8+.Тем не менее, это все еще может быть быстрее или быстрее, чем это решение (основываясь на моем опыте работы с другими базами данных).