gpt4 book ai didi

cassandra - 我可以对 Cassandra 2.1 中的集合进行多查询吗?

转载 作者:行者123 更新时间:2023-12-01 02:11:08 24 4
gpt4 key购买 nike

在 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';

这可能吗?

最佳答案

Is this possible?



有点,是的。你应该这样做吗?不,不是真的。让我解释...

虽然 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)

虽然这在技术上有效,但它是 可怕的想法
  • 多键查询已被确定为一种反模式。使用同步、异步查询通常比使用 IN 快或 CONTAINS为多个键带回行。 DataStax 有一段 SELECT标题为 When Not To Use In 的文档你应该通读一遍。
  • 二级索引表现不佳,集合二级索引的表现甚至比单值索引更差是合乎逻辑的。事实上,该文档有一整节关于 When Not To Use An Index在使用它们之前你应该真正阅读。
  • 使AND运算符(operator)对集合工作两次,ALLOW FILTERING是必须的。 ALLOW FILTERING基本上带回您拥有的每一行(来自每个节点),然后过滤结果。如果您有一个大型数据集和/或多个节点,您应该 从不 使用需要 ALLOW FILTERING 的查询去完成。

  • 正确的方法是使用 tag 构建一个额外的查询表。作为分区键(和 id 作为唯一性的聚集键)。
    CREATE TABLE songsByTag (
    tag text,
    title text,
    id uuid,
    PRIMARY KEY ((tag),id));

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

    关于cassandra - 我可以对 Cassandra 2.1 中的集合进行多查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277096/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com