AnalyticDB for MySQL のマテリアライズドビューは、クエリ結果を事前計算して保存するため、繰り返しの読み取りでは毎回高コストな集約を実行する代わりに、キャッシュされたデータにヒットします。以下のケースでは、3つのチームがマテリアライズドビューを使用してクエリレイテンシーを削減し、手動のリフレッシュパイプラインを排除し、高い同時負荷下でデータベースを安定させた方法を紹介します。
マテリアライズドビューを使用する状況
マテリアライズドビューは、次のような場合に最も効果的です:
クエリに複雑な操作 (JOIN、GROUP BY、集約) が含まれ、頻繁に実行される場合
ソースデータが予測可能なスケジュール (1時間ごと、夜間など) で変更される場合
多数のユーザーが同じ集計済みデータを同時にクエリする場合
レポートの生成時間が長く、ビジネス機会の損失につながっている場合
Business Advisor のクエリレイテンシー削減
背景情報
Business Advisor は、数千万のマーチャントが店舗運営を分析するために使用する Alibaba のサービスです。販売促進期間中、トラフィックスパイクによりリアルタイム分析が特に重要になります。このサービスは、販売されたプロダクト、購入者、訪問者、ショッピングカートへの追加、支払額という5つのメトリックを追跡し、店舗、プロダクト、チャンネル別に分類して、各マーチャントの業界や場所ごとのランキングを表示します。また、Business Advisor は、1日の中での店舗のランキング傾向や、1日を通したランキングの変動も表示します。
Business Advisor は AnalyticDB for MySQL 上で実行され、販売促進期間中には1時間ごとの分析を提供します。
マテリアライズドビューがどのように役立ったか
マテリアライズドビューがない場合、1時間ごとのクエリはそれぞれ JOIN および GROUP BY 操作を含むリアルタイム計算をトリガーし、クエリごとに少なくとも 1 秒かかっていました。24時間分のデータを表示するには 24 回のクエリが必要で、合計で 24 秒かかりました。これは、許容されるレイテンシーしきい値を超えていました。
1時間ごとの事前計算された結果をマテリアライズドビューに保存することで、各クエリは生データから再計算するのではなく、ビューから読み取ります。クエリ時間は、クエリごとに 1 秒から 100 ミリ秒に短縮されました。
マーケティングプラットフォームのデータリフレッシュの自動化
背景情報
ある顧客は、アパレル企業向けに自動化されたマーケティングサービスを提供しています。レポートを生成するには、会員データ、在庫データ、その他のソースが必要です。データ量が膨大で処理が複雑なため、レポートが遅延し、マーケティング担当者が時間的制約のある機会を逃す原因となっていました。また、同時に処理されるクエリが多数あるため、データベースが不安定になる可能性もありました。
マテリアライズドビューがどのように役立ったか
チームは、夜間スケジュールでマテリアライズドビューの自動リフレッシュを設定しました。ビューには事前処理済みの結果が保存されているため、レポートのクエリは生のテーブルではなく、すでに集約されたデータに対して実行されます。
2つの成果がありました:
レポートの高速化:高負荷な計算はクエリ時ではなく、オフピークのリフレッシュウィンドウ中に実行されるため、クエリは迅速に完了します。
個別のスケジューラが不要:AnalyticDB for MySQL のスケジュールされたリフレッシュモードがリフレッシュを自動的に処理するため、別のタスクスケジューリングシステムを維持する必要がなくなります。
Cainiao のスポットチェックレポートの安定化
背景情報
Alibaba Group の一員である Cainiao は、大量の倉庫パッケージを処理しています。従業員は、過去7日間のデータを対象としたスポットチェックレポートを定期的に確認します。各レポートには、プロダクト情報、スポットチェック率、合格率、パッケージ数が含まれます。
これらのレポートの生成は、大量のコンピューティングリソースを消費していました。「独身の日 (Double 11)」のようなピークイベント中には、パッケージのボリュームが急増し、レポートの生成はさらに遅くなりました。多数の同時接続ユーザーからの不規則で大規模なクエリが、不安定さを増大させていました。
マテリアライズドビューがどのように役立ったか
Cainiao は、7日間のスポットチェックデータを事前計算し、1時間ごとにリフレッシュするマテリアライズドビューを作成しました。従業員は、生のテーブルに対して完全な集約を実行する代わりに、時間ベースのフィルターを使用してビューにクエリを実行します。
CREATE MATERIALIZED VIEW xxx_report
REFRESH NEXT now + interval 1 hour
AS
SELECT ...
WHERE create_time >= select current_date() - interval 7 day