使用cql在Cassandra中选择特定记录

使用cql在Cassandra中选择特定记录,cassandra,cql,cqlsh,Cassandra,Cql,Cqlsh,这是我使用的模式: CREATE TABLE playerInfo ( key text, column1 bigint, column2 bigint, column3 bigint, column4 bigint, column5 text, value bigint, PRIMARY KEY (key, column1, column2, column3, column4, column5) ) WITH COMPACT STORAGE AND bloom_filter_fp_cha

这是我使用的模式:

CREATE TABLE playerInfo (
key text,
column1 bigint,
column2 bigint,
column3 bigint,
column4 bigint,
column5 text,
value bigint,
PRIMARY KEY (key, column1, column2, column3, column4, column5)
)   
WITH COMPACT STORAGE AND
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};
注意:我使用复合键。有这样一个记录:

 key      | column1    | column2 | column3  | column4 | column5           | value
----------+------------+---------+----------+---------+--------------------------------------------------+-------
 Kitty    | 1411       |       3 | 713      |       4 |   American        |     1
在cqlsh中,如何选择它?我尝试使用:

cqlsh:game> SELECT * FROM playerInfo WHERE KEY = 'Kitty' AND column5 = 'American';
但结果是:

Bad Request: PRIMARY KEY part column5 cannot be restricted (preceding part column4 is either not restricted or by a non-EQ relation)

那么我如何选择这样的单元格呢?

您已经选择了主键作为主键,column1,column2,column3,column4,column5,因此如果您要在column5上给出where子句,那么您还需要指定key,column1,column2,column3,column4的where子句。例如

如果要在第2列上给出where子句,那么还需要指定键column1的where子句。例如


若要在主键的特定列上指定where子句,则还需要给出前一列的where子句。因此,您需要以一种巧妙的方式选择cassandra数据建模,以获得良好的读写性能,并满足您的业务需求。但是,如果业务逻辑让您满意,那么cassandra性能将不会让您满意。如果cassandra的性能让您满意,那么您的业务逻辑将不会让您满意。这就是卡桑德拉的魅力所在。当然,cassandra需要进一步改进。

您已经选择主键作为主键,column1、column2、column3、column4、column5,因此如果要在column5上给出where子句,那么您还需要指定键的where子句,column1、column2、column3、column4。例如

如果要在第2列上给出where子句,那么还需要指定键column1的where子句。例如


若要在主键的特定列上指定where子句,则还需要给出前一列的where子句。因此,您需要以一种巧妙的方式选择cassandra数据建模,以获得良好的读写性能,并满足您的业务需求。但是,如果业务逻辑让您满意,那么cassandra性能将不会让您满意。如果cassandra的性能让您满意,那么您的业务逻辑将不会让您满意。这就是卡桑德拉的魅力所在。当然,cassandra需要进一步改进。

有一种方法可以通过创建辅助索引,根据不属于主键的列来选择行。 让我用一个例子来解释这一点

在此模式中:

CREATE TABLE playerInfo (
    player_id int,
    name varchar,
    country varchar,
    age int,
    performance int,
    PRIMARY KEY ((player_id, name), country)
);
主键的第一部分,即player_id和name是分区键。该行的哈希值将决定该行将写入cassandra集群中的哪个节点

因此,我们需要在where子句中指定这两个值来获取记录。比如说

SELECT * FROM playerinfo WHERE player_id = 1000 and name = 'Mark B';

 player_id | name   | country | age | performance
-----------+--------+---------+-----+-------------
      1000 | Mark B |     USA |  26 |           8
如果主键的第二部分包含超过2列,则必须为主键左侧的所有列(包括该列)指定值

在这个例子中

PRIMARY KEY ((key, column1), column2, column3, column4, column5)
对于基于column3的筛选,必须为key、column1、column2和column3指定值。 对于基于列5的筛选,需要指定键、列1、列2、列3、列4和列5的值

但是,如果您的应用程序要求对不属于分区键一部分的特定列使用筛选,您可以在这些列上创建二级索引

要在列上创建索引,请使用以下命令

CREATE INDEX player_age on playerinfo (age) ;
现在,您可以根据年龄筛选列

SELECT * FROM playerinfo where age = 26;

 player_id | name    | country | age | performance
-----------+---------+---------+-----+-------------
      2000 | Sarah L |      UK |  26 |          24
      1000 |  Mark B |     USA |  26 |           8
在Cassandra中使用索引时要非常小心。仅当表中的记录很少,或者更准确地说,这些列中的不同值很少时,才使用此选项

您还可以使用

DROP INDEX player_age ;

请参阅,有关更多详细信息,可以通过创建辅助索引,根据不属于主键的列选择行。 让我用一个例子来解释这一点

在此模式中:

CREATE TABLE playerInfo (
    player_id int,
    name varchar,
    country varchar,
    age int,
    performance int,
    PRIMARY KEY ((player_id, name), country)
);
主键的第一部分,即player_id和name是分区键。该行的哈希值将决定该行将写入cassandra集群中的哪个节点

因此,我们需要在where子句中指定这两个值来获取记录。比如说

SELECT * FROM playerinfo WHERE player_id = 1000 and name = 'Mark B';

 player_id | name   | country | age | performance
-----------+--------+---------+-----+-------------
      1000 | Mark B |     USA |  26 |           8
如果主键的第二部分包含超过2列,则必须为主键左侧的所有列(包括该列)指定值

在这个例子中

PRIMARY KEY ((key, column1), column2, column3, column4, column5)
对于基于column3的筛选,必须为key、column1、column2和column3指定值。 对于基于列5的筛选,需要指定键、列1、列2、列3、列4和列5的值

但是,如果您的应用程序要求对不属于分区键一部分的特定列使用筛选,您可以在这些列上创建二级索引

要在列上创建索引,请使用以下命令

CREATE INDEX player_age on playerinfo (age) ;
现在,您可以根据年龄筛选列

SELECT * FROM playerinfo where age = 26;

 player_id | name    | country | age | performance
-----------+---------+---------+-----+-------------
      2000 | Sarah L |      UK |  26 |          24
      1000 |  Mark B |     USA |  26 |           8
在Cassandra中使用索引时要非常小心。仅当表中的记录很少,或者更准确地说,这些列中的不同值很少时,才使用此选项

您还可以使用

DROP INDEX player_age ;
有关更多详细信息,请参阅和 >