2011-10-18 15 views
1

私たちのサイトには78の広告ボタンがあり、サイズの理由からメインのデータベースから統計情報を分離しています。ボタンの1つをクリックするたびに記録し、情報をすばやく取得できる統計画面に取り組んでいます。クエリ内の関連するカウント

上記のクエリは機能しますが、実行するには4000秒かかりますが、どのようにして同じ結果をより効率的に得ることができますか。

SELECT 
    buttons.buttonID, 
    buttons.live, 
    buttons.title, 
    buttons.image, 
    count(buttonclicks.id) as count 
FROM buttons INNER JOIN otherdb.buttonclicks ON buttons.buttonID = buttonclicks.buttonid 
WHERE buttonclicks.type=0 
GROUP BY buttons.buttonID 
ORDER BY buttons.live DESC, buttons.buttonID ASC 

が高速ですが、唯一の理由は、WHERE句の過去3ヶ月(我々は古いクリックをアーカイブする)でクリックされているこれらのボタンをピックアップ:

としてクエリを実行します。

ソリューション?

+0

ボタンをクリックしてボタンを '記述できますか?あなたはイデックスを適切に設定しましたか? – user973254

+1

2番目のクエリでINNERではなくLEFTを使用します。 – symcbean

+0

buttonidはbuttonclicksのインデックスであり、buttonIDはボタン用です。 – jonners99

答えて

0

このクエリを試してみてください。

SELECT tbl1.buttonID, 
     tbl1.live, 
     tbl1.title, 
     tbl1.image, 
     COUNT(tbl2.buttonid) as count 
    FROM buttons AS tbl1 
INNER JOIN (SELECT buttonid FROM otherdb.buttonclicks b WHERE b.type=0) tbl2 
    ON tbl1.buttonID = tbl2.buttonid 
GROUP BY tbl1.buttonID 
ORDER BY tbl1.live DESC, tbl1.buttonID ASC 

また、イメージフィールドがあることがわかりました。私は、イメージオブジェクトを扱うBLOB型なので、クエリが遅いと思う。

+0

JOINのINNERをLEFTに変更すると、勝者が得られます。ありがとうブライアン。 – jonners99

0

ボタンとボタンクリックテーブルのインデックスを作成して、クエリが必要なフィールドを先読みするようにしてください。

+0

上記のように、buttonidはbuttonclicksのインデックスであり、buttonIDのボタンIDです。 – jonners99

関連する問題