# 二次インデックスのシャーディング戦略 ## 定義 二次インデックス(セカンダリインデックス)のシャーディング戦略とは、レコードをパーティションキーで分割したシャーディング済みデータベースにおいて、パーティションキー以外の列・フィールドに対する検索(色が赤の車をすべて探す、等)を可能にするインデックスをどう配置するかという設計問題である。プライマリキーによるシャーディングと異なり、二次インデックスは複数のレコードにまたがる値の出現を指し示すものであり、シャードへきれいに写像できない。[[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 7 Sharding]]は**ローカル**と**グローバル**の2方式を対比する。 ## 2方式の比較 | 観点 | ローカルセカンダリインデックス(document-partitioned) | グローバルセカンダリインデックス(term-partitioned) | |---|---|---| | インデックスの配置単位 | 各シャードが自シャード内のレコードのみを対象に自前で保持 | インデックスされる値(term)自体をパーティションキーとして別途シャーディング | | 書き込みコスト | 単一シャードの更新で完結 | 1レコードの書き込みが複数のインデックスシャードに波及しうる(文書中の各termが別シャードの可能性) | | 読み取りコスト(パーティションキー不明時) | 全シャードへクエリを送り結果をマージする必要がある(tail latency amplificationの影響を受けやすい) | 単一条件のクエリは1シャードの読み取りで済む。ただし実レコードの取得には複数シャードへのアクセスが必要 | | 複数条件のAND検索 | 各シャードが自己完結してAND評価できる | 条件ごとに異なるシャードにpostings listがある場合、ネットワーク越しの積集合計算が必要になりうる(postings listが長いと低速) | | 整合性維持の難度 | 低い(1シャード内でのみ整合性を保てばよい) | 高い(複数シャードにまたがる更新を単一障害点なく整合させる必要があり、分散トランザクションが選択肢になる) | | 採用例 | MongoDB, Riak, Cassandra, Elasticsearch, SolrCloud, VoltDB | CockroachDB, TiDB, YugabyteDB, DynamoDB(ローカルとの併用も可) | (Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 7 Sharding]] "Local Secondary Indexes", "Global Secondary Indexes") ## 補足: DynamoDBの非同期反映 DynamoDBはローカル・グローバル両方の二次インデックスをサポートするが、グローバル側は書き込みが非同期に反映されるため、グローバルインデックス経由の読み取りが古くなる(stale)場合がある。これはレプリケーションラグと同種の問題である。グローバルインデックスは読み取りスループットが書き込みスループットより高く、かつpostings listがそれほど長くならない場合に有利とされる。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 7 Sharding]] "Global Secondary Indexes") ## 横断的知見 - (今後 DDIA 以外のソースが分散データベースの二次インデックス実装を扱った際に、ローカル/グローバルの選択理由や実装上の工夫を突き合わせて追記する) ## 未解決の問い - ローカルセカンダリインデックスの全シャードスキャンは「シャード数を増やしても読み取りスループットが向上しない」制約を持つとDDIA第7章は指摘する。この制約は分析クエリの並列シャード実行(第11章のバッチ処理の議論)とどう関係するか。全シャードスキャンが避けられない読み取りパターンでは、OLTP的なシャーディングよりOLAP的な並列実行モデルの方が適しているのではないか。 - グローバルセカンダリインデックスの複数シャード書き込みを分散トランザクションなしで整合させる実装(DynamoDBの非同期反映以外)には何があるか。CockroachDB・TiDB・YugabyteDBはそれぞれどの整合性保証を選んでいるか、章は詳細を述べていない。 - キー・バリューストアは一般に二次インデックスを持たないとDDIA第7章は述べるが、アプリケーション側で二次インデックスを自作する場合の整合性維持の実践パターン(章が警告するレースコンディション対策)は、どのような具体的手法があるか。 ## 関連 - ソース: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 7 Sharding]] - 概念: [[データパーティショニング]] / [[マルチテナンシーのためのシャーディング]] ## 出典 - [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 7 Sharding]] "Sharding and Secondary Indexes", "Local Secondary Indexes", "Global Secondary Indexes"