sql >> データベース >  >> RDS >> Mysql

MySQL:大きなテーブルをパーティションに分割しますか、それとも別々のテーブルに分割しますか?

    さて、あなたが新しい答えを望んでいるなら、それはあなたがおそらく私の答えを読んだことを意味します、そして私は壊れた記録のように聞こえます。 パーティション化ブログを参照してください。 パーティショニングがパフォーマンスに役立ついくつかのユースケース。あなたはしません 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:概要テーブルブログ 標準偏差を取得する方法を示しています。



    1. ORA-01264:ログ・ファイル名を作成できません

    2. SQLServerの「datetimeoffset」ストレージサイズを理解する

    3. php:文字列データを数値データに変更する方法

    4. TYPEPROPERTY()を使用して、SQLServerのデータ型に関する情報を返します。