Cassandra 有两个主键并使用第二个
Cassandra has two primary key and use the second
我在 Cassandra 中创建了下一个 table
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="Operation failed - received 0 responses and 1 failures" info={'failures': 1, 'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
如何按 index2 搜索?
Cassandra 在查询数据方面不如关系数据库灵活。
你所说的index1
和index2
实际上在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 的数据建模时,如果需要某些查询而单个 table 无法提供服务,您通常会对 table 进行非规范化。例如,如果您需要单独查询 index2,您可以使用此模式创建第二个 table:
create table zzz (
index1 int,
index2 int,
name text,
primary key ((index2), index1, name)
)
现在可以执行SELECT * FROM zzz WHERE index2 = 2;
请注意,在这种情况下,您还需要确保 index2
分区不会变得太大。
还有一些其他功能可以实现更灵活的查询,但您在使用它们之前应该充分了解它们的局限性,因为如果不按预期使用它们可能会导致严重的性能或操作问题:
如果您是 Cassandra 的新手,我强烈建议您阅读 Cassandra 数据建模最佳实践,因为它不像关系数据库那样简单。有很多关于此的优秀博客和资源 - google 是你的朋友!
我在 Cassandra 中创建了下一个 table
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="Operation failed - received 0 responses and 1 failures" info={'failures': 1, 'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
如何按 index2 搜索?
Cassandra 在查询数据方面不如关系数据库灵活。
你所说的index1
和index2
实际上在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 的数据建模时,如果需要某些查询而单个 table 无法提供服务,您通常会对 table 进行非规范化。例如,如果您需要单独查询 index2,您可以使用此模式创建第二个 table:
create table zzz (
index1 int,
index2 int,
name text,
primary key ((index2), index1, name)
)
现在可以执行SELECT * FROM zzz WHERE index2 = 2;
请注意,在这种情况下,您还需要确保 index2
分区不会变得太大。
还有一些其他功能可以实现更灵活的查询,但您在使用它们之前应该充分了解它们的局限性,因为如果不按预期使用它们可能会导致严重的性能或操作问题:
如果您是 Cassandra 的新手,我强烈建议您阅读 Cassandra 数据建模最佳实践,因为它不像关系数据库那样简单。有很多关于此的优秀博客和资源 - google 是你的朋友!