Ускорьте ВНУТРЕННЕЕ СОЕДИНЕНИЕ MYSQL к двум таблицам - PullRequest
0 голосов
/ 25 января 2012

Цель этого запроса - вести себя как поиск. К сожалению, запрос в настоящее время выполняется от 1,5 до 2 секунд, что недопустимо. После запуска EXPLAIN для запроса, я вижу, что он использует «Использование временного; Использование сортировки файлов» и никаких индексов. Однако я не совсем уверен, где можно разместить индекс для этого запроса.

ORDER BY также значительно замедляет запрос, но это необходимо. Любые предложения о том, как улучшить этот запрос?

SELECT DISTINCT p.id, p.date,
(
  SELECT COUNT(post_id) FROM post_tags WHERE post_id = pt.post_id
) as t_count 
FROM post_tags pt 
INNER JOIN posts p 
  ON (pt.post_id = p.id) 
WHERE pt.t_id IN (7,456)
ORDER BY t_count, p.s_count DESC, p.id DESC 
LIMIT 0, 50;

Вот оператор EXPAIN: https://gist.github.com/e742982e435cf082c033

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Если вы видите «Использование временного»;в вашем объяснении это обычно означает, что у вас недостаточно памяти для «заказа по» или другой операции.

Для этого запроса я думаю, что у вас увеличилось значение my.conf

sort_buffer_size=128M
0 голосов
/ 25 января 2012

Переписываю как:

SELECT p.id
     , p.date
     , COUNT(*) AS t_count 
FROM posts p
  INNER JOIN post_tags pts 
    ON pts.post_id = p.id
WHERE EXISTS
      ( SELECT *
        FROM post_tags pt
        WHERE pt.post_id = p.id
          AND pt.t_id IN (7,456)
      )
GROUP BY p.id
ORDER BY t_count, p.s_count DESC, p.id DESC 
LIMIT 0, 50 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...