注意:对于我的示例,我去掉了列名周围的双引号。除了在列名(而不是值)中保留大小写之外,它实际上并没有做任何事情,只是为了搞砸工作。
是否有任何约束查询同时指定主键和辅助键的CQL?
首先,我需要弄清楚你的“主键”和“辅助键”到底是什么。如果您将C 称为“辅助键”,那么“是”可以,但有一些限制。如果您的意思是您的 partition 密钥 (A) 和您的 cluster 密钥 (B),那么可以。
通过您的分区键和集群键(甚至您的分区键)进行查询:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERe A='abc' AND B='def';
a | b | c | d | e | f
-----+-----+-----+-----+-----+-----
abc | def | ghi | jkl | mno | pqr
(1 rows)
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERe A='abc';
a | b | c | d | e | f
-----+-----+-----+-----+-----+-----
abc | ddd | ghi | jkl | mno | pqr
abc | def | ghi | jkl | mno | pqr
(2 rows)
当我创建您的表和索引时,插入几行,然后运行您的查询:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERE A='abc' AND B='def' AND C='ghi';
a | b | c | d | e | f
-----+-----+-----+-----+-----+-----
abc | def | ghi | jkl | mno | pqr
(1 rows)
这行得通。
如果我在我的 CQL 中指定了分区键,这里是“A”='abc'(如果错误请纠正我),为什么 C* 仍然尝试其他显然不保存数据的分区?
我认为这不是问题所在。您正在将其限制为单个分区,因此它应该只从abc 分区查询数据。
我在这张表中插入了数十亿条记录。
您所看到的是,二级索引的使用被认为是 Cassandra 中的“反模式”的原因。二级索引的工作方式与它们在关系世界中的工作方式不同。它们只是不能很好地扩展到大型集群或数据集。
有解决这个超时问题的提示吗?
是的。使用 C 作为第二个集群键重新创建您的表。并且不要在C上创建索引。
CREATE TABLE foo (A text, B text, C text, D text, E text, F text,
PRMIARY KEY (A, B, C));
重新加载您的数据,然后这应该适合您:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERE A='abc' AND B='def' AND C='ghi';
它不仅应该工作,而且不应该超时,而且应该很快。