cassandra,select 通过非主键

cassandra, select via a non primary key

我是 cassandra 的新手,遇到了一个问题。我创建了一个键空间 demodb 和一个 table 用户。 table 有 3 列:id(int 和主键)、firstname(varchar)、name(varchar)。 这个请求给我带来了好的结果:

SELECT * FROM demodb.users WHERE id = 3;

但是这个:

SELECT * FROM demodb.users WHERE firstname = 'francois';

不起作用,我收到以下错误消息:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "

这个请求也不行:

SELECT * FROM users WHERE firstname  = 'francois'  ORDER BY id DESC LIMIT 5;
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."

提前致谢。

cassandra 有一个约束条件:where 子句中要使用的任何字段都必须是table 的主键,或者必须有二级索引。所以你必须为 firstname 创建一个索引,只有在那之后你才能在 where 条件中使用 firstname 并且你会得到你期望的结果。

This request also doesn't work:

那是因为您误解了 Cassandra 中的排序顺序。不要在 firstname 上使用二级索引,而是专门为此查询创建一个 table,如下所示:

CREATE TABLE usersByFirstName (
  id int,
  firstname text,
  lastname text,
  PRIMARY KEY (firstname,id));

此查询现在应该有效:

SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;

请注意,我在 firstnameid 上创建了一个复合主键。这将在 firstname 上对您的数据进行分区(允许您按它进行查询),同时还会按 id 对数据进行聚类。默认情况下,您的数据将按 id 升序聚类。要改变此行为,您可以在 table 创建语句中指定 CLUSTERING ORDER

WITH CLUSTERING ORDER BY (id DESC)

...然后您甚至不需要 ORDER BY 子句。

我最近写了一篇关于 Cassandra 中聚类顺序如何工作的文章 (We Shall Have Order)。它解释了这一点,并涵盖了一些排序策略。