1000個のSQLクエリを実行するPHPページがあります。これは、ユーザーのリストに対して発生したイベントに関する統計を提供します。ページの読み込みには少し時間がかかります(インデックスを調整して6秒になりました)。1000の個別のクエリよりもこれを行う別の/より良い方法があるかどうか知りたいです。そして、特にデータが大きくなるにつれて、より速い方法があります。
これらの1000個のSQLクエリの結果はPHP配列に配置され、最終的には次のようにhtmlテーブルのセルに入力されます。
Installs Called Early Install Event4 Event5 (... 9
George 5 6 3 5 29 different event
Greg 9 7 1 8 23 types, up to
David 4 1 2 4 0 maybe 15
Dan 15 17 4 20 10 eventually)
... ... ... ... ... ...
... ... ... ... ... ...
Totals 351 312 82 289 1220
(... there are up to ~50 users, maybe 100 total in the next two years)
一部の列は、実際には(event4 / installs)*100などのデータからPHPでその場で計算されるパーセンテージです。
テーブルは常に次のような特定のデータ範囲を超えています。
日付範囲を選択してください:Dates Jan 15, 2013 - March 31, 2013
。
event
テーブルのフィールド:id, event_type, user_id, event_date
データ自体は、特定の日に発生するイベントで構成されるテーブルとして保存されます。PHPページが起動するSQLステートメントの最も頻繁なタイプは、次のようなカウントクエリです。
SELECT COUNT(id)
FROM events
WHERE userid = 10
AND `event_date` BETWEEN '2013-01-01' AND '2013-02-15'
AND event_type = 'Install';
SELECT COUNT(id)
FROM events
WHERE userid = 10
AND `event_date` BETWEEN '2013-01-01' AND '2013-02-15'
AND event_type = 'Called';
SELECT COUNT(id)
FROM events
WHERE userid = 10
AND `event_date` BETWEEN '2013-01-01' AND '2013-02-15'
AND event_type = 'Early Install';
/* and so on for each event type and user id */
これらのcounts()は、htmlテーブルのセルに入力されます。これらのcounts()は、各ユーザー(html出力テーブルの各行を表す)を調べ、各行内で各イベントタイプ(列)を調べ、それぞれに対してaを実行するphpループで実行されますCOUNT
。〜50ユーザー、〜10イベントタイプ、1ページに約1000の個別SQLリクエストを取得します。
- これらすべての個別のSQL操作を組み合わせる、またはPHPから
COUNT
の個別の呼び出しをすべて行わずに、これをすべてより高速またはより正確に行うための合理的な方法はありますか?COUNT
多分ストアドプロシージャ...それは意味がありますか?もしそうなら、どのようにアプローチするか(カウントクエリまたはカーソルなどの束)?ストアドプロシージャから計算されたカウントデータの行を作成/返す方法は?
私が知りたいのは、これが「正しい方法」®なのかということです。
私は質問全体に対する答えを求めているのではなく、必ずしもあなたが答えることができるかもしれない部分、またはあなたがどのようにアプローチするかに対する答えだけを求めているのではありません。
また(#2)このようなものはどのようにキャッシュされますか?すべてのCOUNT値をPHPに取り込み、それらの値をPHPから各ユーザーと各日付範囲の行を含むmysqlテーブルに書き出すことによってキャッシュされますか、それともどこか別の場所にキャッシュされますか?