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;
请注意,我在 firstname
和 id
上创建了一个复合主键。这将在 firstname
上对您的数据进行分区(允许您按它进行查询),同时还会按 id
对数据进行聚类。默认情况下,您的数据将按 id
升序聚类。要改变此行为,您可以在 table 创建语句中指定 CLUSTERING ORDER
:
WITH CLUSTERING ORDER BY (id DESC)
...然后您甚至不需要 ORDER BY
子句。
我最近写了一篇关于 Cassandra 中聚类顺序如何工作的文章 (We Shall Have Order)。它解释了这一点,并涵盖了一些排序策略。
我是 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;
请注意,我在 firstname
和 id
上创建了一个复合主键。这将在 firstname
上对您的数据进行分区(允许您按它进行查询),同时还会按 id
对数据进行聚类。默认情况下,您的数据将按 id
升序聚类。要改变此行为,您可以在 table 创建语句中指定 CLUSTERING ORDER
:
WITH CLUSTERING ORDER BY (id DESC)
...然后您甚至不需要 ORDER BY
子句。
我最近写了一篇关于 Cassandra 中聚类顺序如何工作的文章 (We Shall Have Order)。它解释了这一点,并涵盖了一些排序策略。