さて、あなたが新しい答えを望んでいるなら、それはあなたがおそらく私の答えを読んだことを意味します、そして私は壊れた記録のように聞こえます。 パーティション化ブログを参照してください。 パーティショニングがパフォーマンスに役立ついくつかのユースケース。あなたはしません 4つのケースのいずれかのように聞こえます。
device_id
を縮小します 。 INT
4バイトです。あなたは本当に何百万ものデバイスを持っていますか? TINYINT UNSIGNED
は1バイトで、範囲は0..255です。 SMALLINT UNSIGNED
は2バイトで、範囲は0..64Kです。これでテーブルが少し縮小します。
本物の場合 質問は、どのように多くのデータを管理するかについてです。それでは、「既成概念にとらわれずに考えてみましょう」。続きを読む。
グラフ化...どの日付範囲をグラフ化していますか?
- 「最後の」時間/日/週/月/年?
- 任意の時間/日/週/月/年?
- 日/週/月/年の境界に縛られていない任意の範囲?
何をグラフ化していますか?
- 1日の平均値?
- 1日の最大/分?
- 日や週などの燭台(など)
いずれの場合でも、データを使用して要約テーブルを作成(および段階的に維持)する必要があります。行には、1時間の要約情報が含まれます。提案します
CREATE TABLE Summary (
device_id SMALLINT UNSIGNED NOT NULL,
sensor_id TINYINT UNSIGNED NOT NULL,
hr TIMESTAMP NOT NULL,
avg_val FLOAT NOT NULL,
min_val FLOAT NOT NULL,
max_val FLOAT NOT NULL
PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;
1つのサマリーテーブルは9GB(現在のデータ量の場合)である可能性があります。
SELECT hr,
avg_val,
min_val,
max_val
FROM Summary
WHERE device_id = ?
AND sensor_id = ?
AND hr >= ?
AND hr < ? + INTERVAL 20 DAY;
480時間のhi/lo/avg値が表示されます。グラフ化するのに十分ですか?サマリーテーブルから480行を取得する方が、生データテーブルから60*480行を取得するよりもはるかに高速です。
1年間同様のデータを取得すると、グラフ作成パッケージが詰まる可能性があるため、可能性があります。 要約の要約を作成する価値があります-1日の決議で。約0.4GBになります。
サマリーテーブルを作成するには、いくつかの異なる方法があります。その美しさを熟考し、概要テーブルブログ> 。 1時間分のデータを収集してから、Summaryテーブルを拡張するのが最善の方法かもしれません。これは、私のステージングテーブルブログで説明したフリップフロップのようなものです。 。
また、1時間ごとの要約がある場合、分ごとのデータが本当に必要ですか?それを捨てることを検討してください。または、たとえば1か月後のデータかもしれません。これはパーティショニングの使用につながりますが、古いデータを削除するという利点のためだけに パーティショニングブログ
の「ケース1」で説明されているように 。つまり、DROP
を使用して、毎日パーティションを作成します。 およびREORGANIZE
「ファクト」テーブルの時間をシフトするために毎晩。これにより、145 GBのフットプリントが減少しますが、多くのデータが失われることはありません。新しいフットプリント:約12GB(1時間ごとの要約+過去30日間の分ごとの詳細)
PS:概要テーブルブログ 標準偏差を取得する方法を示しています。