Database design 创建索引,或添加到主键并创建新表?

Database design 创建索引,或添加到主键并创建新表?,database-design,cassandra,database,nosql,Database Design,Cassandra,Database,Nosql,在Cassandra中,我有一个带有列(a、b、c)的表。我需要从{table}中查询SELECT*,其中a=?和b=?和从{table}中选择*,其中a=?和c=? 在这种情况下,我应该如何设置主键?我可以用主键(a,b)和主键(a,c)创建两个表吗,因为Cassandra需要按其列出的顺序列出整个分区键和/或非分区键?或者我可以像主键(a)那样在b和c上创建索引 基本上,主键是否应该只包含唯一性所需的最小值(并从这些值中选择适当的分区键)?如果我向主键添加其他列,因为我需要查询它们,那么性能

在Cassandra中,我有一个带有列
(a、b、c)
的表。我需要从{table}中查询
SELECT*,其中a=?和b=?
从{table}中选择*,其中a=?和c=?

在这种情况下,我应该如何设置主键?我可以用
主键(a,b)
主键(a,c)
创建两个表吗,因为Cassandra需要按其列出的顺序列出整个分区键和/或非分区键?或者我可以像
主键(a)
那样在
b
c
上创建
索引


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

如上所述,只有提供有关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)));

希望这对您有所帮助

您提供的信息很难回答。请编辑完整的架构和列基数详细信息以了解更多信息。只有这些信息,模式才能被分析。谢谢你的详细回答!一般来说,为每个查询创建一个新表是可以的,就像我在上面多次看到的那样?例如,考虑是否将此情况扩展到具有五个参数的表,这些参数以不同的顺序查询。可以创建几个(3-4)具有相同信息但主键不同的表来适应这些查询吗?最后一个问题:查询
SELECT*FROM TABLE WHERE a=?b=?c=?
主键(a,b,c)
或带
主键(a,b)
索引(在
c
上)
?在Cassandra中复制表很好,因为写入速度很快,磁盘空间很便宜。然而,相同数据的3-4个表也可能是错误模型或用例的标志,这并不真正适合Cassandra。按主键查询总是更快。二级索引在写入和读取上都有开销。如果分区密钥经过预筛选,它们的性能会更好,但仍然需要维护和访问它们。另一方面,它们使用起来更方便,所以我建议创建一个PoC和度量。