2017-10-12 44 views
1

我在同時執行超過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'也是主鍵,但未在此選擇查詢中使用。

任何幫助,將不勝感激。提前致謝。

回答

1

不要使用指數頻繁更新或刪除列

記住,當不使用索引

  • 在高基數列的記錄體積巨大的查詢少數結果
  • 在使用計數器列的表中。
  • 在一個經常更新或刪除列
  • 尋找一個行中的大的分區,除非狹義查詢

我覺得你列status有低基數和經常更新。由於您通過提供分區密鑰id縮小搜索範圍,所以低基數對您來說不是問題。 主要問題是您經常更新索引列狀態。每次你更新cassandra存儲墓碑。

Cassandra在索引中存儲墓碑,直到墓碑限制達到100K個單元。超過邏輯刪除限制後,使用索引值的查詢將失敗。

因此,您應該按應用層中的狀態列值過濾數據。

相關問題