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

时间:2017-10-12 10:26:15

标签: cassandra cassandra-3.0

我在同时执行超过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'也是主键,但未在此选择查询中使用。

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

1 个答案:

答案 0 :(得分:1)

请勿在经常更新或删除的列上使用索引

请记住何时不使用索引

  • 在高基数列上查询少量结果的大量记录
  • 在使用计数器列的表格中。
  • 经常更新或删除的专栏
  • 要查询大分区中的行,除非查询范围

我认为您的专栏status基数较低且经常更新。由于您通过提供分区键id来缩小搜索范围,因此低基数对您来说不是问题。 主要问题是您经常更新索引列状态。每当你更新cassandra存储一个墓碑。

  

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

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