Cassandraクエリー操作ピットレコード


例表
CREATE TABLE employee
(
    name            TEXT,
    age             SMALLINT,
    phone           TEXT,
    bornDate        DATE,
    createDate      timestamp,
    PRIMARY KEY ((bornDate),name, age,phone, createDate)
)
    WITH compression = {
        'chunk_length_in_kb' : 256,
        'class' : 'LZ4Compressor',
        'enabled' : true
        } AND CLUSTERING ORDER BY (age asc, bornDate asc, createDate desc )

1.プライマリ・キー・シーケンス・クエリー・リミット
cassandraプライマリ・キーはpartition keyプライマリ・キーと複数のclustering key複合プライマリ・キーであり、プライマリ・キーのクエリー順序はテーブル構造の定義時と一致しなければならない.
つまり、次のクエリは間違っています.
select * from employee where age = 1 and name = '  ' and bornDate='1999-01-01'

正しい書き方はこうすべきだ
select * from employee where bornDate = '1999-01-01' and name ='  ' and age=1

2.パーティション化プライマリ・キーのクエリー制限
cassandraでパーティション化されたプライマリ・キーは等号またはinでのみクエリーでき、範囲クエリーは使用できません.
つまり生年月日での範囲照会はできません
select * from employee where  bornDate >='1999-01-01' and name='  ';

生年月日inでクエリーする必要があります.inクエリーは効率的ではありませんので、テーブル設計時に注意してください.
select * from employee where bornDate in ('1999-01-01','1999-01-02') and name = '  '

3.範囲キークエリー制限
cassandraの範囲クエリーは、条件クエリーの最後の場所にのみ配置できます.たとえば、範囲クエリーageの場合、phoneクエリー条件を追加することはできません.
つまり書き方が間違っているのです
select * from employee where bornDate = '2019-01-01' and name ='  ' and age >18 and phone = '123456'

もちろんそうはいかないわけではありませんが、ALLOW FILTERINGを付けなければなりませんが、お勧めはありません
つまり次のような書き方で大丈夫です
select * from employee where bornDate = '2019-01-01' and name ='  ' and age >18 and phone = '123456'  allow filtering;

4.ソート・ルール
cassandraはテーブルの作成時にソートルールを設定し、現在のテーブルのようにデフォルトでソートします.デフォルトでは、正の順序age、正の順序bornDate、逆の順序createDateが使用されます.手動で逆の順序を設定するには、すべてのソートフィールドを逆にする方法が1つしかありません.つまり、このようにする必要があります.
select * from employee where bornDate in ('1999-01-01') and name = '  ' order by  age desc, bornDate desc, createDate asc

5.パーティションのプライマリ・キー条件に対するソートの制限
cassandraではソートを使用する限り、デフォルトのソートルールを使用するか逆のソートルールを使用するかにかかわらず、パーティション・プライマリ・キーはクエリーに等しいものしか使用できません(inは使用できますが、INのデータは1つしか使用できません).
だからこのように書くのは間違いです
select * from employee where bornDate in ('1999-01-01','1999-01-02') and name = '  ' order by  age desc, bornDate desc, createDate asc

べきである
select * from employee where bornDate in ('1999-01-01') and name = '  ' order by  age desc, bornDate desc, createDate asc

または
select * from employee where bornDate = '1999-01-01' and name = '  ' order by  age desc, bornDate desc, createDate asc

6.InとOrder byを使用する場合は、ページをグローバルに閉じる必要があります.
Cluster.Builder()
    .AddContactPoints(cassandraUrls)
    //        pageSize    ,         ,    in  order by
    .WithQueryOptions(new QueryOptions().SetPageSize(int.MaxValue))
    .Build();

転載先:https://www.cnblogs.com/yan7/p/11423382.html