在 Cassandra 中,我有一个包含列 (a,b,c)
的表格。我要么需要查询 SELECT * FROM {table} WHERE a = ?和 b = ?
和 SELECT * FROM {table} WHERE a = ?和 c = ?
。
在这种情况下,我应该怎样做主键呢?我可以用 PRIMARY KEY(a,b)
和 PRIMARY KEY(a,c)
创建两个表吗,因为 Cassandra 需要整个分区键和/或非分区键的排列顺序?或者我可以做类似 PRIMARY KEY(a)
的事情并在 b
和 c
上创建一个 INDEX
吗?
基本上,主键是否应该仅包含唯一性所需的最少数量的值(并从这些值中选择合适的分区键)?如果我将其他列添加到主键,因为我需要查询它们,性能会提高吗?
最佳答案
如上所述,只有提供有关 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) 执行查询。通常建议避免使用secondary index,但是case 2)你在(a,c)上的查询预选了partition key(字段a),所以secondary index可以在单节点上执行,性能不会变坏了。
如果您在 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)));
希望对你有帮助
关于database-design - 创建索引,还是添加到主键并创建新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934698/