最初にこれを行う悪い方法を示します。これらの行を挿入する場合:
insert into foo (row,column,txt) values (1,1,'First Insert');
insert into foo (row,column,txt) values (1,2,'Second Insert');
insert into foo (row,column,txt) values (2,1,'First Insert');
insert into foo (row,column,txt) values (2,2,'Second Insert');
する
'select row from foo;'
あなたに次のものを与えます:
row
-----
1
1
2
2
行と列のすべての可能な組み合わせを示しているため、明確ではありません。クエリを実行して 1 つの行の値を取得するには、列の値を追加できます。
select row from foo where column = 1;
ただし、次の警告が表示されます。
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING
Ok。次に、これで:
select row from foo where column = 1 ALLOW FILTERING;
row
-----
1
2
偉大な。私が欲しかったもの。ただし、その警告を無視しないでください。10000 などの少数の行しかない場合、これはパフォーマンスに大きな影響を与えることなく機能します。10億あればどうなるの?ノードの数とレプリケーション ファクターによっては、パフォーマンスが深刻な打撃を受けることになります。まず、クエリはテーブル内のすべての可能な行をスキャンし (全テーブル スキャンを読み取り)、結果セットの一意の値をフィルター処理する必要があります。場合によっては、このクエリがタイムアウトになることがあります。それを考えると、おそらくあなたが探していたものではありません。
複数のテーブルに挿入する際のパフォーマンスへの影響について心配しているとのことでした。複数のテーブルの挿入は、完全に有効なデータ モデリング手法です。Cassandra は膨大な量の書き込みを実行できます。同期するのが面倒なので、正確なアプリケーションはわかりませんが、一般的なヒントを提供できます。
個別のスキャンが必要な場合は、パーティション列を考慮する必要があります。これは、インデックス テーブルまたはクエリ テーブルと呼ばれるものです。Cassandra データ モデルで考慮すべき重要な点は、アプリケーション クエリです。行として IP アドレスを使用していた場合、次のようなものを作成して、すべての IP アドレスを順番にスキャンします。
CREATE TABLE ip_addresses (
first_quad int,
last_quads ascii,
PRIMARY KEY (first_quad, last_quads)
);
ここで、192.xxx アドレス空間にいくつかの行を挿入するには:
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000000001');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000000002');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000001001');
insert into ip_addresses (first_quad,last_quads) VALUES (192,'000001255');
192 スペースで個別の行を取得するには、次のようにします。
SELECT * FROM ip_addresses WHERE first_quad = 192;
first_quad | last_quads
------------+------------
192 | 000000001
192 | 000000002
192 | 000001001
192 | 000001255
すべての単一アドレスを取得するには、0 から 255 までのすべての可能な行キーを反復処理するだけです。私の例では、パフォーマンスを維持するために、アプリケーションが特定の範囲を要求することが予想されます。アプリケーションにはさまざまなニーズがあるかもしれませんが、ここでパターンを確認できることを願っています。