2012-01-25 12 views
0

このクエリの目的は、検索のように動作することです。残念ながら、このクエリは現在1.5秒から2秒で実行されていますが、これは許容できません。クエリでEXPLAINを実行した後、「一時的な使用; filesortの使用」とインデックスが使用されています。しかし、私はあなたがこのクエリにインデックスを置くことができるかどうかは正確には分かりません。高速化MYSQL INNER JOIN 2つのテーブル間のクエリ

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