JSONシャレディング
JSONシャレディングは、従来の行ベースストレージを最適化された列ベースストレージに変換することでJSONクエリを高速化します。データモデリングのためのJSONの柔軟性を維持しながら、Zilliz Cloudは舞台裏で列ベースの最適化を実行し、アクセスおよびクエリ効率を大幅に向上させます。
JSONシャレディングは、ほとんどのJSONクエリシナリオで効果的です。パフォーマンスの利点は以下の場合により顕著になります。
-
より大きく複雑なJSONドキュメント - ドキュメントサイズが大きくなるにつれてパフォーマンス向上が大きくなります
-
読み取り中心のワークロード - JSONキーでの頻繁なフィルタリング、ソート、検索
-
混合クエリパターン - 異なるJSONキーにわたるクエリは、ハイブリッドストレージアプローチの恩恵を受けます
動作原理
JSONシャレディングプロセスは、高速な検索にデータを最適化するために3つの明確な段階で行われます。
フェーズ1: インジェストとキー分類
新しいJSONドキュメントが書き込まれる際、Zilliz Cloudはそれらを継続的にサンプリング・分析し、各JSONキーの統計情報を構築します。この分析には、キーの出現率と型の安定性(ドキュメント間でデータ型が一貫しているかどうか)が含まれます。
これらの統計情報に基づき、JSONキーは最適なストレージ用に以下のカテゴリに分類されます。
JSONキーのカテゴリ
キー型 | 説明 |
|---|---|
型付きキー | ほとんどのドキュメントに存在し、常に同じデータ型を持つキー(例:すべて整数またはすべて文字列)。 |
動的キー | 頻繁に出現するが、混合データ型を持つキー(例:場合によっては文字列、場合によっては整数)。 |
共有キー | 出現頻度が低いかネストされたキーで、設定可能な頻度しきい値よりも低い。 |
分類例
以下のJSONキーを含むサンプルJSONデータを考えてみましょう。
{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4} // bは混合型になる
{"a": 50, "b": 2, "e": "rare"} // eは出現頻度が低い
このデータに基づき、キーは以下のように分類されます。
-
型付きキー:
aおよびf(常に整数) -
動的キー:
b(混合文字列/整数) -
共有キー:
e(出現頻度が低いキー)
フェーズ2: ストレージ最適化
フェーズ1の分類によりストレージレイアウトが決定されます。Zilliz Cloudはクエリに最適化された列形式を使用します。

-
シャレッド列: 型付きおよび動的キーについては、専用の列にデータが書き込まれます。この列ベースストレージにより、クエリ時の高速・直接スキャンが可能となり、Zilliz Cloudはドキュメント全体を処理することなく、指定されたキーに必要なデータのみを読み取ることができます。
-
共有列: すべての共有キーは、単一のコンパクトなバイナリJSON列に一緒に保存されます。この列には共有キーの逆インデックスが構築されます。このインデックスは、指定されたキーを含む行だけに検索範囲を効果的に絞り込むことで、Zilliz Cloudがデータを迅速にプルーニングできるようにすることにより、低頻度キーのクエリを高速化する上で不可欠です。
フェーズ3: クエリ実行
最終フェーズでは、最適化されたストレージレイアウトを活用して、各クエリ述語に対する最速パスを賢く選択します。
-
高速パス: 型付き/動的キーのクエリ(例:
json['a'] < 100)は、専用の列に直接アクセスします -
最適化パス: 共有キーのクエリ(例:
json['e'] = 'rare')は、逆インデックスを使用して関連ドキュメントを迅速に特定します
パフォーマンスベンチマーク
私たちのテストでは、異なるJSONキー型およびクエリパターンにわたる顕著なパフォーマンス向上が示されました。
テスト環境および手法
-
ハードウェア: 1コア/8GBクラスター
-
データセット: JSONBench の100万ドキュメント
-
平均ドキュメントサイズ: 478.89バイト
-
テスト期間: 100秒間のQPSおよびレイテンシを測定
結果:型付きキー
このテストでは、ほとんどのドキュメントに存在するキーをクエリした際のパフォーマンスを測定しました。
クエリ式 | キー値の型 | シャレディングなしのQPS | シャレディングありのQPS | パフォーマンス向上 |
|---|---|---|---|---|
| 整数 | 8.69 | 287.50 | 33倍 |
| 文字列 | 8.42 | 126.1 | 14.9倍 |
結果:共有キー
このテストでは、"共有"カテゴリに分類されるスパース・ネストされたキーをクエリすることに焦点を当てました。
クエリ式 | キー値の型 | シャレディングなしのQPS | シャレディングありのQPS | パフォーマンス向上 |
|---|---|---|---|---|
| ネストされた整数 | 4.33 | 385 | 88.9倍 |
| ネストされた文字列 | 7.6 | 352 | 46.3倍 |
主な洞察
-
共有キークエリは最も劇的な改善(最大89倍高速)を示します
-
型付きキークエリは15-30倍の安定したパフォーマンス向上を提供します
-
すべてのクエリ型はパフォーマンス低下なしにJSONシャレディングの恩恵を受けます
よくある質問
-
JSONシャレディングとJSONインデクシングの選択方法は?
-
JSONシャレディングは、ドキュメント内に頻繁に出現するキーに理想的であり、特に複雑なJSON構造に適しています。列ベースストレージと逆インデックスの利点を組み合わせており、多くの異なるキーをクエリする読み取り中心のシナリオに適しています。ただし、非常に小さなJSONドキュメントには推奨されません。パフォーマンス向上は最小限です。JSONドキュメントの総サイズに対するキー値の割合が小さければ小さいほど、シャレディングによるパフォーマンス最適化はより良くなります。
-
JSONインデクシングは、特定のキーに基づくクエリのターゲット最適化に適しており、ストレージオーバーヘッドが低くなります。シンプルなJSON構造に適しています。JSONシャレディングは配列内のキーに対するクエリをカバーしていないため、それらを高速化するにはJSONインデックスが必要であることに注意してください。
詳細はJSONフィールド概要を参照してください。
-