作为新手,我有一个关于卡桑德拉的问题. 我想知道是否有可能以某种方式使用CONTAINS语句进行查询(我发现In语句可能不是最适合大量数据的语句),该语句接受一系列内容.

大概是这样的:

SELECT * FROM table WHERE column CONTAINS('valueA', 'valueB');

在网上搜索,我读到这应该是不可能的,但如果我处理太多的值,我想我将不得不写60个CONTAINS,并且查询会太繁重.

所以我在想,这在卡桑德拉是否有可能,或者有解决办法.谢谢!

推荐答案

SELECT * FROM table WHERE column CONTAINS('valueA', 'valueB');

因此,虽然您提到了IN语句,但这基本上就是您在这里要求它做的事情.这肯定会奏效.如果我有一个名为times的表,其单个主键为id,我可以使用IN运算符执行此操作:

SELECT * FROm times WHERE id IN (2,4);

 id | time_timestamp                  | time_uuid
----+---------------------------------+--------------------------------------
  2 | 2038-01-19 03:14:07.000000-0600 | 5d83408f-6944-11fe-7f7f-7f7f7f7f7f7f
  4 | 2038-01-18 21:14:07.000000-0600 | 12e8d08f-6912-11fe-7f7f-7f7f7f7f7f7f

(2 rows)

CONTAINS章有点不一样我很确定它只接受一个参数.但CONTAINS只适用于集合列; List、Set或Map类型的列.所以如果我有一个表playlists,列tags LIST<TEXT>tags列上的索引,那么这就可以工作了:

SELECT * FROM playlists WHERE tags CONTAINS 'Progressive Rock';

 name         | song                | artist | tags
--------------+---------------------+--------+------------------------------
 favorite 70s | La Villa Strangiato |   Rush | ['Rock', 'Progressive Rock']
 favorite 70s |              Xanadu |   Rush | ['Rock', 'Progressive Rock']


(2 rows)

至于"对于大量数据来说不是最好的"这一部分,你是对的.这两种方法都不太适合卡桑德拉.第一个是我们所说的"多键查询",第二个是"二级索引查询".Cassandra在大行场景中工作得很好,因为它可以通过对分区键运行散列来确定哪些 node 拥有数据.

当Cassandra无法确定包含数据的 node 时(就像多键和二级索引查询的情况一样).它 Select 一个称为"协调器 node "的 node .然后,该 node 负责联系(在二级索引查询的情况下)集群中的所有其他 node ,组合结果集,并将其返回给调用应用程序.这将网络时间引入到等式中.

如果您运行的是6 node 集群,这可能还不算太差.然而,60个 node 的集群就不会那么宽容了.此外,如果查询拉回太多结果,它可能会用完协调器 node 上的所有可用堆内存,导致它崩溃.

这就是为什么基于PRIMARY KEY运行查询是推荐的方法.因为只需要联系1个或2个 node 就可以返回结果,而不是所有 node 都需要轮询.坚持你的主键.如果这对你的查询不起作用,那么用不同的主键创建一个新表,因为这在集群上A)更快B)更容易.

Database相关问答推荐

TYPO3 OOPS,出现错误!编码:202402180809040864ba5c

什么是 CREATE VIEW IF NOT EXISTS in postgresql

Phonegap如何在android上保存永久数据

按请求的可变事务隔离级别

skip bad record in redshift data load

Symfony ArrayCollection 与 PersistentCollection

FOR UPDATE和JOIN的 SQL 语义

nvarchar (50) 与 nvarchar (max) 的含义

SQLite3 不支持外键约束吗?

MySQL:LAST_INSERT_ID() 返回 0

A QuerySet 按聚合字段值

显式事务回滚是否必要?

Twisted + SQLAlchemy 和最好的方法

MySQL 从一个数据库插入另一个数据库

分离实体和被管理实体

C# IEnumerator/yield struct 可能不好?

以可能的数据丢失为代价提高 PostgreSQL 写入速度?

用于 sql 表中的状态列的类型

如何将空值传递给外键字段?

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 类似功能是什么