我在同时执行超过2000个SELECT查询时遇到超时错误。我正在为Cassandra 3.7(JAVA版本8)使用gocql客户端。
"错误":" gocql:在超时期限内没有收到来自cassandra的回复" ...
我将下表作为架构,
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'是主要关键和“#”状态'是where子句中的二级索引。 ' MESSAGE_ID'也是主键,但未在此选择查询中使用。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:1)
请勿在经常更新或删除的列上使用索引
请记住何时不使用索引
我认为您的专栏status
基数较低且经常更新。由于您通过提供分区键id
来缩小搜索范围,因此低基数对您来说不是问题。 主要问题是您经常更新索引列状态。每当你更新cassandra存储一个墓碑。
Cassandra在目标中存储墓碑,直到墓碑限制达到100K格。超过逻辑删除限制后,使用索引值的查询将失败。
因此,您应按应用层中的状态列值过滤数据。