У меня есть запрос, похожий на этот
FROM products AS p, ..
LEFT JOIN ( SELECT .. ) AS popularity on popularity.products_id = p.products_id
LEFT JOIN ( SELECT .. ) AS reviews on reviews.products_id = p.products_id
WHERE..
AND..
..
Вложенные SELECT
из LEFT JOIN
являются статическими, я имею в виду, что на возвращаемый результат не влияют внешние значения. Эти два SELECT
используют данные из db и вычисляют результат. Результаты этих запросов редко меняются, когда некоторые пользователи делают обзор для продукта, например.
Проблема в том, что эти SELECT
занимают много времени, чтобы пройти, они проходят через каждую строку своих соответствующих таблиц.
Есть ли способ сделать этот запрос быстрее, превратив его в несколько меньших запросов? Или кэширование вложенных выборок каким-то образом?
Я согласен с тем, что мне трудно ответить без дополнительной информации. Однако прочитайте этот пост: http://www.xaprb.com/blog/2006/04/30/how-to-optimize-subqueries-and-joins-in-mysql. В прошлом я нашел его полезным.
Если вы посмотрите на последний абзац, вы увидите методику сохранения результатов вложенных выборок во временной таблице.
Возможно, вы захотите добавить некоторые индексы к таблицам, которые используются в ваших инструкциях подзапроса, при правильной индексации базы данных можно было бы мгновенно вернуть результаты из миллионов строк.