Подбирать или не выбирать?
Я начинаю знакомиться с подвыборками, но ATM я просто ломаю голову, почему MySQL пинает себя в пах следующим образом:
SELECT
id_topic,
id_member_comment,
pd.username,
dt_post
FROM forum_comment c
LEFT JOIN persondata pd
ON c.id_member_comment = pd.id_member
WHERE id_comment IN (
SELECT MAX(last_id_comment) AS id_comment
FROM forum_topic
GROUP BY cat_id
);
Если я запускаю запрос SELECT MAX(last_id_comment) AS id_comment FROM forum_topic GROUP BY cat_id
отдельно и подставьте набор результатов в id_comment IN (...)
раздел, то он выполняется в одно мгновение, но когда выполняется вышеупомянутый запрос с подвыбором, для его завершения требуются возрасты.
Оптимизатор просматривает все комментарии (многие миллионы) один за другим вместо того, чтобы сначала запускать подзапрос и использовать его значения? Что мне здесь не хватает?
1 ответ
Решение
Попробуйте переместить IN в предложение FROM в качестве встроенной производной таблицы.
SELECT
id_topic, id_member_comment, pd.username, dt_post
FROM
(
SELECT MAX(last_id_comment) AS id_comment
FROM forum_topic
GROUP BY cat_id
) AS foo
JOIN
forum_comment c ON foo.id_comment = c.id_comment --AND a cat_id join too?
LEFT JOIN
persondata pd ON c.id_member_comment = pd.id_member;