たとえば、中程度の数の行(〜100,000程度)があり、いずれかの行に次のサンプルデータがあるjsonb
列を持つテーブルがあるとします。
{"name":"Bob", "favoriteColor":"red", "someOtherObject": {"somethingElse": true}}
次の方が効率的ですか?
Jsonb列でGINインデックスを使用し、次にPostgresの組み込みJSONクエリ関数を使用してデータを引き出します
検索できるものを表すためにいくつかの列を作成します。つまり、name
の1つの列、favoriteColor
の1つの列などです。それらの列にBツリーインデックスを作成してから、select document from table where name = 'Bob'
他の解決策はありますか?
ソリューションはlike
クエリを効率的にサポートして、特定の入力文字列で始まる値を検索できるようにする必要があることに注意してください。
JSONの利点は汎用性です。テーブル定義を変更せずに任意のキーを追加できます。アプリケーションがJSONを直接読み書きできる場合、便利かもしれません。
個別の列は、すべてのパフォーマンス面でjson
またはjsonb
列を組み合わせたものよりも優れていますと他のいくつかの側面でも:より洗練された型システム、全機能(チェック、一意、外部キー制約、デフォルト値など)、テーブルが小さく、インデックスが小さく、クエリが高速です。
text
列でのプレフィックスの一致には、text_pattern_ops
インデックス:
または、より一般的には、anyLIKE
パターンをサポートするトライグラムインデックス:
JSON(特にjsonb
)を使い続ける一方で、さまざまなインデックス作成戦略もあります。 GINまたはBtreeだけが決定するものではありません。部分インデックス、式インデックス、さまざまな演算子クラス(特に:jsonb_path_ops
)関連:
いくつかのこと
スカラー上にbtreeを作成していて、ルックアップがそれよりも複雑でない場合は、btreeが勝つことは明らかです。