Cassandra选择使用Gocql驱动程序给出超时错误的查询

问题描述:

我在同时执行超过2000个SELECT查询时收到超时错误。我正在使用gocql客户端Cassandra 3.7(JAVA版本8)。Cassandra选择使用Gocql驱动程序给出超时错误的查询

“错误”: “gocql:从没有超时期限内收到卡桑德拉响应” ...

我有如下表模式

CREATE TABLE my_db.my_message (
    id text, 
    message_id uuid, 
    message text, 
    version text, 
    status tinyint, 
    PRIMARY KEY (id, message_id) 
) 

CREATE INDEX IF NOT EXISTS ON my_db.my_message(status); 

下面是我的查询当同时执行超过2000个查询时会产生超时错误。

"SELECT * FROM my_db.my_message WHERE id=? AND status = ?" 

'id'是主键,'status'是where子句中的二级索引。 'message_id'也是主键,但未在此选择查询中使用。

任何帮助,将不胜感激。提前致谢。

不要使用指数频繁更新或删除列

记住,当不使用索引

  • 在高基数列的记录体积巨大的查询少数结果
  • 在使用计数器列的表中。
  • 在一个经常更新或删除列
  • 寻找一个行中的大的分区,除非狭义查询

我觉得你列status有低基数和经常更新。由于您通过提供分区密钥id缩小搜索范围,所以低基数对您来说不是问题。 主要问题是您经常更新索引列状态。每次你更新cassandra存储墓碑。

Cassandra在索引中存储墓碑,直到墓碑限制达到100K个单元。超过逻辑删除限制后,使用索引值的查询将失败。

因此,您应该按应用层中的状态列值过滤数据。