cassandra查询性能:对复合分区键的一部分使用in子句

j8ag8udp  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(307)

我目前在cassandra中设置了一个表,该表有文本、十进制或日期类型的列,其中包含业务日期和帐号的复合分区键。对于此表的查询,我需要能够支持对给定日期的单个帐户或帐户列表的查找。
例子:

select x,y,z from my_table where business_date = '2019-04-10' and account_number IN ('AAA', 'BBB', 'CCC')
//Note: Both partition keys are provided for this query

我一直在努力解决与访问这些数据相关的性能问题,因为我注意到延迟模式,我在试图理解/解释时遇到了困难。
在许多情况下,客户机应用程序可以在短时间内运行相同的查询,总共三次。对于这些场景,我看到三分之二的请求的响应时间非常糟糕(800毫秒),其中一个请求的响应时间非常快(50毫秒)。一开始我认为这可能是由于键或行缓存造成的,但是,我不太确定,因为我认为如果这是真的,那么三个请求中的第三个请求应该总是最快的,事实并非如此。
我认为我面临的第二个问题是实际的数据模型本身。尽管提交查询时提供了所有的分区键,但由于它是in子句,结果将是单独的分区,并且可以分布在集群中,因此这将是一种糟糕的访问模式。但是,即使运行单个帐户查询,我也会看到这些延迟问题。另外,我看到有15-20个帐户的查询执行得非常好(在50ms以下),所以我不确定数据模型是否真的有问题。
群集设置:
数据中心:2个
每个数据中心的节点数:3
键空间replication:local_dc =2,远程\u dc=2
java驱动程序集:
负载平衡:使用LatencyWare的dcaware
协议:v3
查询仍然设置为使用“in”子句,而不是异步的单个查询
读取一致性:本地
有没有人有什么想法/线索,我应该把重点放在真正确定这个问题的根本原因方面?

w1e3prcc

w1e3prcc1#

使用 IN 对于分区键,即使对于复合分区键,也总是不好的主意。分区键的值定义了数据在集群中的位置,不同的分区键值很可能将数据放在不同的服务器上。在这种情况下,协调节点(接收到查询的节点)需要联系保存数据的节点,等待这些节点传递结果,然后才将结果发送回您。
如果您需要查询多个分区键,那么异步发出单个查询并在客户端收集结果会更快。
另外,请注意,tokenaware策略在您使用 PreparedStatement -在这种情况下,驱动程序能够提取分区键的值,并找到哪个服务器为它保存数据。

相关问题