cql 查询字符串有最大长度限制吗?
我计划执行一个类似下面的长查询:select * from table where key in ('abc', 'xyz', ...)
,并且我估计查询字符串在最坏情况下可能会达到60kB。
cql 查询字符串有最大长度限制吗?
我计划执行一个类似下面的长查询:select * from table where key in ('abc', 'xyz', ...)
,并且我估计查询字符串在最坏情况下可能会达到60kB。
然而,您需要仔细考虑您的方法 - 在IN
中放置少量值是可以的,但是如果过多将会导致麻烦,因为接收您请求的节点(“协调器”)将需要将查询转发到具有您键数据的所有节点,等待结果,将所有内容收集到一个整体,并发送回去。最有可能的是,这将导致协调器节点过载,要么崩溃,要么超时,或者其他问题。
如果使用异步API并行发出请求,则与使用IN
相比可以获得更好的性能。
在测试过程中,我能够查询长度约为90K的内容,然而在此之后系统开始抛出错误。
根据你读取数据的方式,你可能会在列表中达到65535个项目之前遇到“参数列表过长”的错误。我使用一个仅包含5000个ID的列表(通过cat /proc/sys/kernel/random/uuid
创建)就能够重现这个问题。
IN
参数则是一个问题。这被称为“多键查询”,是Cassandra中已知的反模式。之所以如此糟糕,是因为它将不得不选择一个协调器(无论使用哪种负载平衡策略),并且该协调器将不得不访问集群中的每个节点来满足此查询。专业提示:将您的IN
参数数量保持在可以用一只手数清楚的范围内。 - Aaron