创建一个索引,或者添加到主键并创建一个新的table?

Create an index, or add to the primary key and create a new table?

在 Cassandra 中,我有一个包含 (a,b,c) 列的 table。我要么需要查询 SELECT * FROM {table} WHERE a = ? and b = ?SELECT * FROM {table} WHERE a = ? and c = ?.

这种情况下,主键应该怎么设置呢?我可以用 PRIMARY KEY(a,b)PRIMARY KEY(a,c) 制作两个 table,因为 Cassandra 需要整个分区键 and/or 非分区键,按它们列出的顺序排列?或者我可以做类似 PRIMARY KEY(a) 的事情并在 bc 上创建一个 INDEX 吗?

基本上,主键是否应该只包含唯一性所需的最少数量的值(并从这些值中选择合适的分区键)?如果我因为需要查询它们而将其他列添加到主键,性能会提高吗?

如上所述,只有提供有关 a、b 和 c 列的基数的更多信息,才能给出有根据的答案。还要确保您了解分区键和集群键的含义 - 它们都是主键的一部分,并且对您的设计有巨大影响。

如果a列有足够的不同值,可以将其作为分区键,并从以下两种方法中选择一种:

1) 每个查询分开 table

CREATE TABLE table1_by_ab (
  a int, b int, c int, 
  PRIMARY KEY (a, b));

CREATE TABLE table1_by_ac (
  a int, b int, c int, 
  PRIMARY KEY (a, c));

2) 一个table用于更频繁的查询,索引用于另一列:

CREATE TABLE table2 (
  a int, b int, c int, 
  PRIMARY KEY (a, b));

CREATE INDEX ON table2 (c);

在这两种情况下,您都可以对 (a,b) 和 (a,c) 执行查询。通常建议避免使用secondary index,但是case 2)你在(a,c)上的查询预选了partition key(字段a),所以secondary index可以在单节点上执行,性能不会变坏了。

如果您在 a 列中没有足够的不同值,则无法将其设为分区键,您将需要复制 tables,两者都使用复合分区键:

CREATE TABLE table3_by_ab (
  a int, b int, c int, 
  PRIMARY KEY ((a, b)));

CREATE TABLE table3_by_ac (
  a int, b int, c int, 
  PRIMARY KEY ((a, c)));

希望对您有所帮助