1

Cassandra 1.2.1、複合キーを使用して、特定の partitionID のすべてのレコードを取得しようとしています。以下は、私が使用しているスキーマです。

  • タイムスタンプ
  • デバイスID
  • データ転送
  • ロケーション ID
  • デバイス所有者

主キーは複合キー (タイムスタンプ、デバイス ID) です。したがって、TimeStamp はパーティション キーです。各レコードは 70 ~ 80 バイトになります。

1000 の異なるタイムスタンプがあり、タイムスタンプごとに 50 万のデバイス ID があります。5 億件のレコードがあり、特定のタイムスタンプのすべてのレコードを取得したいと考えています。次のようなもの:

Select * from schema where TimeStamp = '..'

私の理解では、関連する行はすべて連続したディスクの場所に格納されているため、このクエリはすべてのレコードを高速に取得できるはずです。つまり、結果が得られるディスク シークはほとんどありません。フィルタは TimeStamp に基づいています。つまり、クエリでヒットするノードは 1 つだけです。また、データの総量は 500K * 80 バイト ~ 40 MB と、それほど多くはありません。ただし、これを CQL (3) または Astyanax で実行すると、RPC タイムアウトが発生します。

partitionID のすべてのレコードが連続したディスクの場所にあるという私の理解は間違っていますか? そのようなデータを一括取得する正しい方法は何ですか?

4

1 に答える 1

1

最終的に、列は同じ行にあるため、ディスク上で互いに近くなります。しかし、圧縮が完了する前に (つまり、nodetool compact を実行しないと仮定すると)、それらは完了しません。ただし、これらはいくつかの SSTable に分割する必要があります。

ただし、おそらく遅いのは、デシリアライズする CPU であり、他のレプリカからの結果を比較して、シリアライズしてクライアントに戻します。rpc_timeout (デフォルトは 10 秒) 以内に 500k オブジェクトを処理できるとは思えません。

これを行うには、結果をページングする必要があります。

最初のクエリでは、

SELECT * from schema where TimeStamp = '..' limit 1000

次に、最後のデバイス ID を取得し、最後に呼び出します。

SELECT 'last'..'' from schema where TimeStamp = '..' limit 1000

応答で 1000 列未満になるまで。

于 2013-03-19T07:59:38.457 に答える