【问题标题】:Cassandra has two primary key and use the secondCassandra 有两个主键并使用第二个
【发布时间】:2018-08-14 11:44:18
【问题描述】:

我在 Cassandra 中创建了下一个表

create table yyy (
 index1 int,
 index2 int,
 name text,
 primary key ((index1, index2), name)
)

当我仅按 index1 搜索时,完美。没问题!

select * from yyy where index1 ...

购买我无法通过 index2 搜索

ReadFailure: 来自服务器的错误: code=1300 [Replica(s) failed to execute read] message="操作失败 - 收到 0 个响应和 1 个失败" info={'failures': 1, 'received_responses': 0, 'required_responses': 1, '一致性': 'ONE'}

如何按 index2 进行搜索?

【问题讨论】:

  • 您能否发布返回错误的查询?您还创建了任何二级索引吗?

标签: cassandra cassandra-3.0


【解决方案1】:

Cassandra 在查询数据方面的灵活性远低于关系数据库。

您所说的 index1index2 实际上在 Cassandra 中一起称为复合分区键。为了使用 WHERE 子句,您必须始终提供整个分区键。

例如,这些查询会成功:

SELECT * FROM yyy WHERE index1 = 1 AND index2 = 2;

SELECT * FROM yyy WHERE index1 = 1 AND index2 = 2 AND name = 'fred';

但是这些查询都会失败:

SELECT * FROM yyy WHERE index1 = 1;

SELECT * FROM yyy WHERE index2 = 2;

SELECT * FROM yyy WHERE index1 = 1 AND name = 'fred';

这是因为 Cassandra 使用分区键来确定分区将存储在哪个节点上。如果只提供一半的密钥,Cassandra 无法分辨哪个节点包含数据。

在为 Cassandra 进行数据建模时,如果需要某些无法由单个表提供服务的查询,您通常会对表进行非规范化处理。例如,如果您需要单独在 index2 上进行查询,则可以使用此架构创建第二个表:

create table zzz (
 index1 int,
 index2 int,
 name text,
 primary key ((index2), index1, name)
)

现在你可以执行SELECT * FROM zzz WHERE index2 = 2;

请注意,在这种情况下,您还需要确保您的 index2 分区不会变得太大。

还有一些其他功能可以实现更灵活的查询,但您应该在使用它们之前充分了解它们的局限性,因为如果不按预期使用它们可能会导致严重的性能或操作问题:

如果您是 Cassandra 的新手,我强烈建议您阅读 Cassandra 数据建模最佳实践,因为它不像关系数据库那样简单。有很多关于这方面的好博客和资源 - 谷歌是你的朋友!

【讨论】:

  • 谢谢。如果 index1 和 index2 是 key,
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 2021-06-24
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多