CQL 列表值真的限制为 65535 字节吗?
Are CQL list values really limited to 65535 bytes?
此 document 列出了 Cassandra 2.2 的一些 CQL 限制。我对 Set
和 List
的 Collection 限制特别感兴趣。如果我的解释是正确的,该文档指出 Sets 中的值限制为 65535 字节。
据我所知存在这个限制是因为集合标识是用存储引擎单元的列名中的复合值实现的(类似于集群列值限制),CQL 限制为那么多字节。
考虑 table,Set
喜欢
CREATE TABLE test.bounds (
someid text,
someorder text,
words set<text>,
PRIMARY KEY (someid, someorder)
)
和
PreparedStatement ps = session.prepare("INSERT INTO test.bounds (someid, someorder, words) VALUES (?, ?, ?)");
BoundStatement bs = ps.bind("id", "order", ImmutableSet.of(StringUtils.repeat('a', 66000)));
session.execute(bs);
这将抛出预期的异常
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (66024 > 65535)
现在,如果我将 table 更改为使用 List
而不是 Set
CREATE TABLE test.bounds (
someid text,
someorder text,
words list<text>,
PRIMARY KEY (someid, someorder)
)
并使用
BoundStatement bs = ps.bind("id", "order", ImmutableList.of(StringUtils.repeat('a', 66000)));
我没有收到异常。 然而,文档指出 List
值大小也限制为 65535 字节。文档不正确还是我误解了?
我假设 List
值在底层存储中实现为简单的列值,并且顺序通过它们的时间戳来维护。
据我所知,这里的文档是错误的。该限制在协议版本 3(在 C* 2.1 中引入)中已更改。来自协议 3 更改部分下的 native protocol specification:
- The serialization format for collection has changed (both the collection size and
the length of each argument is now 4 bytes long). See Section 6.
因此只要您使用协议版本 3 或更高版本,您就可以创建包含多达 2^31-1 个字节(2147483647)或元素的列表。
编辑:我刚刚注意到您关于集合身份的评论,这可能是存储引擎本身的限制,所以可能出于这个原因文档保留了这种方式,但协议本身现在支持更大的集合。将继续查看我们是否可以记录这种细微差别。
此 document 列出了 Cassandra 2.2 的一些 CQL 限制。我对 Set
和 List
的 Collection 限制特别感兴趣。如果我的解释是正确的,该文档指出 Sets 中的值限制为 65535 字节。
据我所知存在这个限制是因为集合标识是用存储引擎单元的列名中的复合值实现的(类似于集群列值限制),CQL 限制为那么多字节。
考虑 table,Set
喜欢
CREATE TABLE test.bounds (
someid text,
someorder text,
words set<text>,
PRIMARY KEY (someid, someorder)
)
和
PreparedStatement ps = session.prepare("INSERT INTO test.bounds (someid, someorder, words) VALUES (?, ?, ?)");
BoundStatement bs = ps.bind("id", "order", ImmutableSet.of(StringUtils.repeat('a', 66000)));
session.execute(bs);
这将抛出预期的异常
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (66024 > 65535)
现在,如果我将 table 更改为使用 List
而不是 Set
CREATE TABLE test.bounds (
someid text,
someorder text,
words list<text>,
PRIMARY KEY (someid, someorder)
)
并使用
BoundStatement bs = ps.bind("id", "order", ImmutableList.of(StringUtils.repeat('a', 66000)));
我没有收到异常。 然而,文档指出 List
值大小也限制为 65535 字节。文档不正确还是我误解了?
我假设 List
值在底层存储中实现为简单的列值,并且顺序通过它们的时间戳来维护。
据我所知,这里的文档是错误的。该限制在协议版本 3(在 C* 2.1 中引入)中已更改。来自协议 3 更改部分下的 native protocol specification:
- The serialization format for collection has changed (both the collection size and the length of each argument is now 4 bytes long). See Section 6.
因此只要您使用协议版本 3 或更高版本,您就可以创建包含多达 2^31-1 个字节(2147483647)或元素的列表。
编辑:我刚刚注意到您关于集合身份的评论,这可能是存储引擎本身的限制,所以可能出于这个原因文档保留了这种方式,但协议本身现在支持更大的集合。将继续查看我们是否可以记录这种细微差别。