2017-10-04 9 views
0

長いクリックリストを、さまざまなランダーに関連する関連テーブルに分解する最善の方法を見つけようとしています。ネストされたステートメントを最適化する

SELECT LANDER, COUNT(DISTINCT IP) AS CLICKS 
FROM 
(
    SELECT LANDER, USER_GROUP, IP 
    FROM 
    (
      SELECT LANDER USER_GROUP, IP, TIME FROM CLICKS_IN WHERE USER_GROUP = " . $_SESSION["KKGR"] . " 
    )a 
    WHERE TIME BETWEEN '" . date_format($sdate, 'Y/m/d') . "' AND '" . date_format($edate, 'Y/m/d') . "' 
)a 
GROUP BY LANDER HAVING COUNT(*)>5 ORDER BY CLICKS DESC"; 

ユニークなクリックのリストを効率的に取得するために私がこれまでに思いついたのは何ですか。私の2つの問題は、可能であれば、準備されたクエリを書くよりはるかに多くのことですが、ネストされたSQL文ではどうやってそれを行うのか分かりませんし、2番目に、長期間運転する可能性があります。これは単純なSQL文よりもはるかに効率的に実行されていますが、このような場合には、一度RAMにテーブルの多くをバッファリングしてしまうことが懸念されます。

+0

:最適化のための説明計画を使用してください。常に最初に行く計画です。それを解釈するのに助けが必要な場合は、質問に出力を(テキストとして)追加してください。遅さの最も一般的な問題はインデックスがありません –

答えて

0

入れ子が必要ではないと思いますが、TIME列のインデックスを使用するMySQLの機能を妨げている可能性があります。

SELECT LANDER, COUNT(DISTINCT IP) AS CLICKS 
FROM CLICKS_IN 
WHERE USER_GROUP = " $_SESSION['KKGR'] . " 
AND TIME BETWEEN '" . date_format($sdate, 'Y/m/d') . "' AND '" . date_format($edate, 'Y/m/d') . "' 
GROUP BY LANDER 
HAVING CLICKS > 5 
ORDER BY CLICKS DESC 
+0

これは、標準クエリよりも速く動作することの証明です。私はテストとライブの観点から入れ子なしで試しましたが、それははるかに効率的です。 ネストされたクエリは、大きなテーブルの検索で操作回数を大幅に減らします。 編集:あなたのクエリをテストしただけで、ネストされたバージョンが大幅に改善されました。 –

+0

その順序で 'INDEX(user_group、time)'が必要です。 –

関連する問題