【问题标题】:Can I do a multi query on collections in Cassandra 2.1?我可以对 Cassandra 2.1 中的集合进行多重查询吗?
【发布时间】:2015-05-30 09:19:57
【问题描述】:

在 Cassandra 2.1 中,我们可以通过在列上创建二级索引来查询集合。

cqlsh:play> select * from songs where tags contains 't1';

 id                                   | tags         | title

--------------------------------------+--------------+-------

 e99f8f30-d212-11e4-bc9e-5d1b1922b94d | {'t1', 't2'} | Song1

但我想查询多个值 - 像这样:

select * from songs where tags contains 't1|t2';

这可能吗?

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    这可能吗?

    有点,是的。你应该这样做吗?不,不是。让我解释一下……

    虽然 Carlo 是正确的,因为 CQL 不支持 OR,但可以使用 AND。也就是说,你想查询两个标签的存在,你可以这样做:

    aploetz@cqlsh:stackoverflow> SELECT * FROM songs
      WHERE tags CONTAINS 't2' AND tags CONTAINS 't1' ALLOW FILTERING;
    
     id                                   | tags         | title
    --------------------------------------+--------------+-------
     75e46eb2-292a-42d0-8330-510fb35c635b | {'t1', 't2'} | Song1
    
    (1 rows)
    

    虽然这个技术上可行,但它是一个可怕的想法

    • 多键查询已被确定为反模式。使用同步的异步查询通常比使用INCONTAINS 为多个键恢复行更快。 DataStax 在SELECT 文档中有一个标题为When Not To Use In 的部分,您应该仔细阅读。
    • 二级索引表现不佳,合乎逻辑的是,集合上的二级索引的表现甚至比其单值对应物更差。事实上,该文档有一整节关于 When Not To Use An Index 的内容,您在使用它们之前应该认真阅读。
    • 要让AND 操作符在集合上工作两次,ALLOW FILTERING 是必需的。 ALLOW FILTERING 基本上带回了您拥有的每一行(来自每个节点),然后 然后 过滤结果。如果您有一个大型数据集和/或多个节点,您应该切勿使用需要 ALLOW FILTERING 才能完成的查询。

    执行此操作的正确方法是使用tag 作为分区键(并将id 作为唯一性的集群键)构建一个额外的查询表。

    CREATE TABLE songsByTag (
      tag text,
      title text,
      id uuid,
      PRIMARY KEY ((tag),id));
    

    这将允许您按特定标签查询歌曲,而无需二级索引。虽然这将允许您使用 IN(本质上是一个 OR),但对每个键(标签)的多个异步查询仍然会更快。

    【讨论】:

      【解决方案2】:

      您不能:Cassandra 中不支持 OR 运算符。

      干杯, 卡罗

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-03
        • 2021-03-11
        • 2010-12-11
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        相关资源
        最近更新 更多