集計インデックス
集計インデックスは、集計結果を事前計算して保存することで分析クエリを大幅に高速化し、一般的な分析処理のためにテーブル全体をスキャンする必要をなくします。
どのような問題を解決するのか
大規模データセットに対する分析クエリでは、パフォーマンス上の大きな課題があります。
例: 100M 行に対する売上分析クエリ SELECT SUM(revenue), COUNT(*) FROM sales WHERE region = 'US'。集計インデックスがない場合、US のすべての売上レコードをスキャンします。集計インデックスがある場合、事前計算済みの結果を即座に返します。
仕組み
- インデックス作成 → 事前計算する集計クエリを定義する
- 結果の保存 → TiDB Cloud Lake が集計結果を最適化されたブロックに保存する
- クエリマッチング → 受信したクエリが自動的に事前計算済みの結果を使用する
- 自動更新 → 基になるデータが変更されると結果が更新される
クイックセットアップ
-- Create table with sample data
CREATE TABLE sales(region VARCHAR, product VARCHAR, revenue DECIMAL, quantity INT);
-- Create aggregating index for common analytics
CREATE AGGREGATING INDEX sales_summary AS
SELECT region, SUM(revenue), COUNT(*), AVG(quantity)
FROM sales
GROUP BY region;
-- Refresh the index (manual mode)
REFRESH AGGREGATING INDEX sales_summary;
-- Verify the index is used
EXPLAIN SELECT region, SUM(revenue) FROM sales GROUP BY region;
サポートされる操作
更新戦略
自動更新と手動更新の比較
-- Automatic refresh (updates with every data change)
CREATE AGGREGATING INDEX auto_summary AS
SELECT region, SUM(revenue) FROM sales GROUP BY region SYNC;
-- Manual refresh (update on demand)
CREATE AGGREGATING INDEX manual_summary AS
SELECT region, SUM(revenue) FROM sales GROUP BY region;
REFRESH AGGREGATING INDEX manual_summary;
パフォーマンス例
この例は、パフォーマンスが大幅に向上することを示しています。
-- Prepare data
CREATE TABLE agg(a int, b int, c int);
INSERT INTO agg VALUES (1,1,4), (1,2,1), (1,2,4), (2,2,5);
-- Create an aggregating index
CREATE AGGREGATING INDEX my_agg_index AS SELECT MIN(a), MAX(c) FROM agg;
-- Refresh the aggregating index
REFRESH AGGREGATING INDEX my_agg_index;
-- Verify if the aggregating index works
EXPLAIN SELECT MIN(a), MAX(c) FROM agg;
-- Key indicators in the execution plan:
-- ├── aggregating index: [SELECT MIN(a), MAX(c) FROM default.agg]
-- ├── rewritten query: [selection: [index_col_0 (#0), index_col_1 (#1)]]
-- This shows the query uses precomputed results instead of scanning raw data
ベストプラクティス
管理コマンド
重要な注意事項
集計インデックスを使用すべき場面:
- 頻繁な分析クエリ(ダッシュボード、レポート)
- 繰り返し集計を行う大規模データセット
- 安定したクエリパターン
- パフォーマンスが重要なアプリケーション
使用すべきでない場面:
- 頻繁に変更されるデータ
- 一度きりの分析クエリ
- 小さなテーブルに対する単純なクエリ
設定
-- Enable/disable aggregating index feature
SET enable_aggregating_index_scan = 1; -- Enable (default)
SET enable_aggregating_index_scan = 0; -- Disable
集計インデックスは、大規模データセットに対する反復的な分析ワークロードで最も効果を発揮します。まずは、最も一般的なダッシュボードおよびレポート用クエリから始めてください。