【问题标题】:cassandra, select via a non primary keycassandra,通过非主键选择
【发布时间】:2015-06-29 20:49:02
【问题描述】:

我是 cassandra 的新手,但遇到了问题。我创建了一个 keyspace demodb 和一个表 users。该表有 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 cql cqlsh


    【解决方案1】:

    这个请求也不起作用:

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

    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。要更改此行为,您可以在表创建语句中指定 CLUSTERING ORDER

    WITH CLUSTERING ORDER BY (id DESC)
    

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

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

    【讨论】:

    • 我有一个问题,我可以查询 select * from table where id = 3 and firstname = 'something' 我的观点是当提供部分主键时,where 子句中可能有非主键
    • @JustTry 是的,可以这样做,只要非键列上有二级索引。
    【解决方案2】:

    cassandra 有一个约束:你想在 where 子句中使用的任何字段都必须是表的主键,或者上面必须有二级索引。因此,您必须为 firstname 创建一个索引,然后才能在 where 条件中使用 firstname,您将得到您期望的结果。

    【讨论】:

    • 因为你已经给出了主键,所以不需要。仅为名字创建索引。
    • 我为名字创建了索引,现在:SELECT * FROM demodb.users WHERE firstname = 'francois';工作,但 ELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5;还是不行。
    猜你喜欢
    • 2018-01-15
    • 2016-09-26
    • 2015-11-03
    • 2015-04-04
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2020-10-19
    • 2020-10-19
    相关资源
    最近更新 更多