[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация запроса
AlmazDelDiablo
Привет всем!

В наличии сложный запрос, который:
1. Выбирает запись по ID (назовет её post).
2. Выбирает данные об авторе записи, связь один-к-многим.
3. Выбирает метки записи, через связующую таблицу.
4. Выбирает категории записи через связующую таблицу.
5. Выбирает комментарии к записи, связь один-к-многим.
6. Выбирает данные об авторах комментариев.

Вот сам запрос:
SELECT DISTINCT post.*, author.id, author.name, comment.*, c_author.id, c_author.name
FROM "dd_blog_posts" "post"
LEFT OUTER JOIN "dd_users" "author" ON ("post"."id"="author"."id")
LEFT OUTER JOIN "dd_blog_labels_relations" "labels_labels" ON
("post"."id"="labels_labels"."post_id")
LEFT OUTER JOIN "dd_blog_labels" "labels" ON ("labels"."id"="labels_labels"."label_id")
LEFT OUTER JOIN "dd_blog_comments" "comment" ON ("comment"."post_id"="post"."id")
LEFT OUTER JOIN "dd_users" "c_author" ON ("comment"."author_id"="c_author"."id")
WHERE ((post.draft = false) AND ("post"."id"=1))
ORDER BY post.lock, post.timestamp DESC, comment.timestamp


Этот запрос создает огромную результирующую таблицу, в которой есть куда дубликатов нашей изначальной записи, ровно по количеству комментариев к ней. И из-за этого запрос проходит крайне медленно (при трех комментариях, ~8ms, при 100 комментариях, ~110ms).
Вопрос вот в чем. Как можно оптимизировать данный запрос? Или лучше его разбить на много маленьких? И, попутно вопрос к тем, кто знаком с Yii, как можно разбить этот запрос, при этом продолжая использовать вкусности ActiveRecord?

_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.