0

MYSQL データベース テーブルからいくつかの分析データを表示する Web アプリに取り組んでいます。総ユーザー数は最大で10,000人程度を想定しています。このテーブルには、ユーザーごとに数百万のレコードが含まれます。

各ユーザーに独自のテーブルを提供することを検討していますが、さらに重要なことは、データ取得を最適化する方法を見つけたいということです。

SELECT COUNT特定の日の一連のクエリを使用して、データベース テーブルからデータを取得します。以下に例を示します。

SELECT * FROM
(SELECT COUNT(id) AS data_point_1 FROM my_table WHERE customer_id = '1' AND datetime_added LIKE '2013-01-20%' AND status_id = '1') AS col_1
CROSS JOIN
(SELECT COUNT(id) AS data_point_2 FROM my_table WHERE customer_id = '1' AND datetime_added LIKE '2013-01-20%' AND status_id = '0') AS col_2
CROSS JOIN ...

過去 30 日間のデータを取得したい場合、クエリは上記の 30 倍の長さになります。同様に 60 日など。ユーザーは、30、60、90 などの日数とカスタム範囲を選択できます。

時系列グラフのデータが必要です。明確にするために、毎日のデータは、数千から数百万のレコードに及ぶ可能性があります。

私の質問は:

  1. これは、このデータを取得する最もパフォーマンスの高い方法ですか?それとも、必要なすべての時系列データを 1 つの SQL クエリで取得するためのより良い方法はありますか?! ユーザーが過去 2 年間のデータ、つまり 1,000 行を超える可能性のある MySQL クエリを必要としている場合、これはどのように機能するのでしょうか?!

  2. サーバーを減らすために、取得したデータを(たとえばmemcacheを使用して)1時間以上キャッシュすることを検討する必要があります(これは分析データであるため、実際にはリアルタイムである必要がありますが、変更がない場合でも同じデータをクエリするサーバー)?!

任意の支援をいただければ幸いです。

4

1 に答える 1

0

まず、各ユーザーを個別のテーブルに配置しないでください。アプリケーションにほとんど影響を与えない他のオプションがあります。

データのパーティション分割を検討する必要があります。あなたの言うことに基づいて、時間ごと (日、週、または月ごと) に 1 つのパーティションと、ユーザーのインデックスを作成します。クエリはおそらく次のようになります。

select date(datetime), count(*)
from t
where userid = 1 and datetime between DATE1 and DATE2
group by date(datetime)

次に、外部クエリまたはアプリケーションでこれをピボットできます。

また、集計表で分析を実行できるように、データを毎日集計することをお勧めします。これにより、物事がはるかに速くなります。

于 2013-01-31T02:44:47.287 に答える