ORDER BY キーの最適化と materialized view の活用という 2 つの主要な手法を取り上げます。
これらのアプローチによって、クエリ時間を数秒からミリ秒へ短縮できることを見ていきます。
ORDER BY キーを最適化する
project カラムと subproject カラムで絞り込まれるとします。
この場合、それらを ORDER BY キーに追加するのが適切です。さらに、時間でもクエリするため、time カラムも追加します。
それでは、wikistat と同じカラム型を持ち、(project, subproject, time) で並べ替えられた別バージョンのテーブルを作成してみましょう。
| クエリ | (time) | (project, subproject, time) |
|---|---|---|
| 2.381 秒 | 1.660 秒 | |
| 2.148 秒 | 0.058 秒 | |
| 2.192 秒 | 0.012 秒 | |
| 2.968 秒 | 0.010 秒 |
Materialized views
materialized view を作成する
宛先テーブルのバックフィル
wikistat テーブルに新しいレコードが挿入されたときだけです。そのため、バックフィルを行う必要があります。
これを行う最も簡単な方法は、ビューの SELECT クエリ (変換) を使って、INSERT INTO SELECT ステートメントで materialized view のターゲットテーブルに直接挿入することです。
- Null table engine を使って一時テーブルを作成する
- 通常使用している materialized view のコピーをその一時テーブルに接続する
INSERT INTO SELECTクエリを使って、生データセット内のすべてのデータをその一時テーブルにコピーする- 一時テーブルと一時 materialized view を削除する
wikistat_backfill から読み取り、wikistat_top に書き込む materialized view を作成します
wikistat テーブルから wikistat_backfill にデータを投入します: