2012-01-25 4 views
0

Цель этого запроса - действовать как поиск. К сожалению, запрос в настоящее время работает от 1,5 до 2 секунд, что неприемлемо. После запуска EXPLAIN в запросе я вижу, что он использует «Использование временного, с использованием filesort» и никаких индексов. Тем не менее, я не совсем уверен, где вы можете поместить индекс в этот запрос.Ускорение MYSQL INNER JOIN Запрос через две таблицы

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

+0

Можете ли вы опубликовать полный выход объяснить, как хорошо. –

+1

Не эффективнее ли использовать count (pt.post_id) и GROUP BY p.id и p.date? Вы можете избавиться от подзапроса, а затем для стартеров. – dash

+0

@AdrianCornish Я добавил оператор EXPLAIN к сообщению и здесь: https://gist.github.com/e742982e435cf082c033. – stwhite

ответ

0

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

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 ; 
+0

Можете ли вы добавить EXPLAIN для этого? –

+0

Объяснение для вашего запроса похоже на мой первоначальный запрос: https://gist.github.com/c97338f3abf10283955f – stwhite

+0

Можете ли вы добавить определения таблиц и индексы, которые у вас есть? –

0

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

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

sort_buffer_size=128M