Подбирать или не выбирать?

Я начинаю знакомиться с подвыборками, но 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;
Другие вопросы по тегам