mel*_*mel 15 cql cassandra cqlsh
我是cassandra的新手,我遇到了一个问题.我创建了一个keypace demodb和一个表用户.该表有3列:id(int和主键),firstname(varchar),name(varchar).这个请求给我带来了好结果:
SELECT * FROM demodb.users WHERE id = 3;
Run Code Online (Sandbox Code Playgroud)
但是这一个:
SELECT * FROM demodb.users WHERE firstname = 'francois';
Run Code Online (Sandbox Code Playgroud)
不起作用,我收到以下错误消息:
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "
Run Code Online (Sandbox Code Playgroud)
此请求也不起作用:
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."
Run Code Online (Sandbox Code Playgroud)
提前致谢.
Aar*_*ron 15
此请求也不起作用:
那是因为你错误地理解了排序顺序在Cassandra中是如何运作的.不使用辅助索引firstname
,而是专门为此查询创建一个表,如下所示:
CREATE TABLE usersByFirstName (
id int,
firstname text,
lastname text,
PRIMARY KEY (firstname,id));
Run Code Online (Sandbox Code Playgroud)
此查询现在应该有效:
SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
注意,我在firstname
和上创建了一个复合主键id
.这将对您的数据进行分区firstname
(允许您通过它进行查询),同时还可以对数据进行聚类id
.默认情况下,您的数据将按id
升序进行聚类.要更改此行为,可以CLUSTERING ORDER
在表创建语句中指定a :
WITH CLUSTERING ORDER BY (id DESC)
Run Code Online (Sandbox Code Playgroud)
......然后你甚至不需要一个ORDER BY
条款.
我最近写了一篇关于聚类顺序如何在Cassandra(We Shall Have Order)中运行的文章.它解释了这一点,并涵盖了一些订购策略.
cassandra中有一个约束:要在where子句中使用的任何字段都必须是表的主键,或者必须有一个辅助索引.所以你必须为firstname创建一个索引,然后才能在where条件中使用firstname,你将得到你期望的结果.
归档时间: |
|
查看次数: |
19589 次 |
最近记录: |