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)更容易.