2017-10-12 4 views
1

2000を超えるSELECTクエリを同時に実行するとタイムアウトエラーが発生します。私はCassandra 3.7(Javaバージョン8)用のgocqlクライアントを使用しています。Gassqlドライバでタイムアウトエラーが発生するCassandra selectクエリ

"エラー": "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句の2次インデックスです。 'message_id'もプライマリキーですが、このselectクエリでは使用されていません。

ご協力いただければ幸いです。前もって感謝します。

答えて

1

インデックスを上使用したレコードの膨大な量のためのクエリのための高カーディナリティのカラムにインデックス

  • を使用しないときに頻繁列

    更新または削除を忘れないでくださいしないでください少数の結果

  • カウンタ列を使用するテーブルでは。大きなパーティション内の行を探してくださいするには、頻繁に更新または削除された列
  • 狭く

を照会しない限り、私はあなたのコラムstatusが低いカーディナリティがあり、頻繁に更新さだと思います。パーティションキーidを提供することで検索範囲を絞り込んでいるので、カーディナリティが低いので問題はありません。 主な問題は、頻繁にインデックスされた列ステータスを更新することです。 cassandraを更新するたびにtombstoneを保存します。

カサンドラは、墓石の限界が100K細胞に達するまで、墓石をインデックスに保存します。墓石の制限を超えた後、インデックス値を使用するクエリは失敗します。

したがって、アプリケーション層のステータス列の値でデータをフィルタリングする必要があります。

関連する問題