在Cassandra,我有一个包含(a,b,c)
列的表格。我需要查询SELECT * FROM {table} WHERE a = ? and b = ?
和SELECT * FROM {table} WHERE a = ? and c = ?
。
在这种情况下,我应该制作主键?我可以使用PRIMARY KEY(a,b)
和PRIMARY KEY(a,c)
创建两个表,因为Cassandra按照列出的顺序需要整个分区键和/或非分区键吗?或者,我可以执行PRIMARY KEY(a)
之类的操作,并在INDEX
和b
上创建c
吗?
基本上,主键是否只包含唯一性所需的最小值数(并从这些值中选择适当的分区键)?如果我将其他列添加到主键,性能是否会提高,因为我需要查询它们?
答案 0 :(得分:2)
如上所述,只有在提供有关a,b和c列基数的更多信息时,才能给出有根据的答案。另外,请确保您了解分区键和群集键的含义 - 它们都是主键的一部分,并对您的设计产生巨大影响。
如果列a中有足够的不同值,则可以将其设为分区键,并从以下两种方法中选择一个:
1)每个查询的单独表
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)一个表用于更频繁的查询,而索引用于另一列:
CREATE TABLE table2 (
a int, b int, c int,
PRIMARY KEY (a, b));
CREATE INDEX ON table2 (c);
在这两种情况下,您都可以对(a,b)和(a,c)执行查询。通常建议避免二级索引,但是在情况2)你的(a,c)查询预先选择分区键(字段a),因此二级索引可以在一个节点上执行,其性能不会好的。
如果您在列a中没有足够的不同值,那么您无法将其作为分区键,您将需要复制表,两者都使用复合分区键:
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)));
希望这有帮助