CQL3 SELECT...IN 子句中的元组数量是不是有任何限制?

Posted

技术标签:

【中文标题】CQL3 SELECT...IN 子句中的元组数量是不是有任何限制?【英文标题】:Is there any limitation for amount of tuples in CQL3 SELECT...IN clause?CQL3 SELECT...IN 子句中的元组数量是否有任何限制? 【发布时间】:2014-06-22 11:35:30 【问题描述】:

Cassandra CQL3 SELECT 语句允许使用 IN 元组,如 in

SELECT * FROM posts
WHERE userid='john doe' AND (blog_title, posted_at)
IN (('John''s Blog', '2012-01-01), ('Extreme Chess', '2014-06-01'))

从 CQ3 规范中可以看出:http://cassandra.apache.org/doc/cql3/CQL.html#selectStmt

SELECT 的 IN 子句中可以使用的元组数量是否有限制?最大值是多少?

【问题讨论】:

【参考方案1】:

DataStax 的 Rebecca Mills 对 IN 语句中允许的键数提供了明确的限制(Things you should be doing when using Cassandra drivers - 第 22 点):

...特别是对中键数的限制 IN 语句,最多可以有 65535。但实际上 说你应该只在 INs 中使用少量的键,只是 出于性能原因。

我假设该限制也适用于您可以指定的元组数量。不过老实说,我不会试图超越这一点。如果你发送的数量很大,它根本不会表现良好。 CQL documentation on the SELECT CLAUSE 警告用户:

何时不使用 IN

关于何时不使用索引的建议适用于使用 IN 在 WHERE 子句中。在大多数情况下,在 WHERE 中使用 IN 不推荐使用条款。使用 IN 会降低性能,因为 通常必须查询许多节点。例如,在单个本地 具有 30 个节点、复制因子为 3 和 LOCAL_QUORUM 的一致性级别,单键查询出去到两个 节点,但如果查询使用 IN 条件,则节点数 被查询的可能更高,最多 20 个节点,具体取决于 键在令牌范围内的位置。

可以说,虽然您可以通过的元组的最大数量是一个数学问题,但您应该通过的元组数量将取决于您的集群配置, JVM实现,还有一点常识

【讨论】:

以上是关于CQL3 SELECT...IN 子句中的元组数量是不是有任何限制?的主要内容,如果未能解决你的问题,请参考以下文章

列出Prolog中的元组

Typescript:根据枚举成员的数量获取一个固定长度的元组

如何解析具有不同键值数量的元组列表

工具Cassandra 2.1正式发布,引入CQL3元组和用户定义类型

如何在pig中生成一定数量的元组?

如何计算SQL中特定值范围内不变的元组数量