Cassandra - 使用主键列的任意子集按主键搜索

Chr*_*row 4 cassandra nosql

是否有可能在Cassandra中找到主键与所有主键字段的任意子集匹配的记录?

例:

使用下面描述的表,可以找到主键具有特定typename没有指定idsize?的记录.

CREATE TABLE playlists (
  id      uuid,
  type    text,
  name    text,
  size    int,

  artist text,

  PRIMARY KEY (id, type, name, size)
);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ser*_*rán 16

至少在Cassandra 1.2中它是可能的,但它默认是禁用的,

如果你试图这样做:

SELECT * from playlist where type = 'sometype' and name = 'somename';
Run Code Online (Sandbox Code Playgroud)

您将收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以启用它运行:

SELECT * from playlist where type = 'sometype' and name = 'somename' ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)

在您的示例中,Cassandra将允许您从左到右使用主键的完整子集进行查询,例如:

SELECT * from playlist where id = 'someid'; (ALLOWED)
SELECT * from playlist where id = 'someid' and type = 'sometype'; (ALLOWED)
SELECT * from playlist where id = 'someid' and type = 'sometype' and name = 'somename'; (ALLOWED)
SELECT * from playlist where id = 'someid' and type = 'sometype' and name = 'somename' and size=somesize; (ALLOWED)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你

  • 示例中的id字段是分区键,它确定行的存储位置.在where子句中使用此键的过滤器使Cassandra能够有效地将查询重定向到具有相应数据的节点.缺少此分区键会导致Cassandra必须将您的查询发送到群集中的所有节点,这是低效的,因此默认情况下禁用.'ALLOW FILTERING'子句允许进行此类搜索,但您应该将此视为您可能想要更改架构的提示...... (7认同)