2012-01-25 40 views
0

此查詢的用途與搜索一樣。不幸的是,查詢當前運行時間從1.5秒到2秒,這是不可接受的。在查詢上運行EXPLAIN之後,我看到它使用「Using temporary; Using 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

你可以添加說明這個呢? –

+0

您的查詢的解釋似乎與我原來的查詢相同:https://gist.github.com/c97338f3abf10283955f – stwhite

+0

您可以添加表格定義和索引嗎? –

0

如果你看到 「使用臨時的;」在你的外行中,那通常意味着你沒有足夠的記憶力來滿足你的「順序」或其他操作。

對於此查詢,我認爲你有my.conf增加

sort_buffer_size=128M