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个单元。超过逻辑删除限制后,使用索引值的查询将失败。
因此,您应该按应用层中的状态列值过滤数据。