2016-10-24 4 views
2

私はCassandra 3.9と2のテーブルを持つ開発マシンを持っています.1つは~~ 400,000レコード、もう1つは約4,000,000レコードです。それらの構造は異なっている。Cassandra slow SELECT MAX(x)クエリ

それぞれフィールドxにセカンダリインデックスがあり、フォームSELECT MAX(x) FROM tableのクエリを実行しようとしています。最初のテーブルでは、クエリに数秒かかり、2番目のテーブルではタイムアウトします。

私の経験は、これらのクエリが些細で高速な関係データベースです。だからカサンドラでは、インデックスはこれらのクエリを実行するために使用されていないようですね?代わりがありますか?パーティションキーをspecifingせずCassandraの集約関数テーブル上などMINMAXCOUNTSUM又はAVG

答えて

5

は悪い習慣です。代わりに、両方のテーブルのxフィールドの最大値を格納する別のテーブルを持つことができます。

ただし、INSERTまたはUPDATEステートメントを実行すると、他のテーブルでこの最大値を維持するためにクライアントサイドロジックを追加する必要があります。

テーブル構造:

CREATE TABLE t1 (
    pk text PRIMARY KEY, 
    x int 
); 

CREATE TABLE t2 (
    pk text PRIMARY KEY, 
    x int 
); 

CREATE TABLE agg_table (
    table_name text PRIMARY KEY, 
    max_value int 
); 

したがって、この構造では、テーブルの最大値を持つことができます。これはあなたを助けることができる

SELECT max_value 
FROM agg_table 
WHERE table_name = 't1'; 

ホープ。

+0

カッサンドラとのトランザクションやアトミシティを忘れるべきですか? :) –

+0

Cassandraは、行レベルでのアトミック性を保証するだけのトランザクションをサポートしていません。たとえば、2つの更新プログラムを実行すると、1つ前のすべての操作が失敗した場合、ロールバックを実行せずに書き込みが行われます。 –