3

テーブル arg_rec には、テスト マシンで 800K 行が含まれています。通常、このテーブルには 15M 行以上が保持されます。次のクエリを実行したい:

SELECT STE_ID, PNT_NO, YR, MN, AVG(AVR_WS) AS AVR_WS, SUM(AVR_PW) FROM arg_rec GROUP BY STE_ID, PNT_NO, YR, MN;

このクエリは、風力タービン データから毎日の平均風速と総電力を返します。私のテスト マシンでは、主キー列のサブセットにすぎない , , ,STE_IDPNT_NO結合インデックスを使用して、このクエリを 10 分間実行するとタイムアウトになります。インデックスがない場合、クエリは数分後に完了します。YRMN

サーバーの微調整に加えて、次のようなこの問題を処理する他の方法についても知りたいです。

  1. このクエリに基づいてビューを作成し、結果をキャッシュすることは可能ですか?
  2. YR、MN、DY、HR、MI、SC がレコードのタイムスタンプの年、月、日などのフィールドに対応するという事実をカプセル化する、より高度なインデックス作成機能はありますか?
  3. アプリケーションのビジネス層を使用してデータを複製したほうがよいでしょうか?
4

1 に答える 1

14

GROUP BY クエリで最高のパフォーマンスを得るには、カバリング インデックスを次のように追加する必要があります。

ALTER TABLE arg_rec ADD KEY ix1(STE_ID, PNT_NO, YR, MN,AVR_WS, AVR_PW );

インデックスをカバーするには、次を追加します。

  1. 最初に where 句で使用される列、次に
  2. group by で使用される列、次に
  3. 順番に使用される列、次に
  4. 選択で使用される列。

詳細については、次を参照してください。MySQL での最適化によるグループ化

  1. Query Cache Configurationでクエリ キャッシュ ルートを有効にすることで、MySQL でクエリをキャッシュできます。

  2. YR、MN、DY、HR、MI、SC をデータ型 as を持つ単一の列に格納できますTIMESTAMP。これにより、インデックス作成と操作によるグループ化のパフォーマンスが向上します。

于 2012-07-24T13:03:59.290 に答える