4

セカンダリ インデックスを持つ列ファミリーがあります。セカンダリ インデックスは基本的にバイナリ フィールドですが、文字列を使用しています。フィールドはis_exportedと呼ばれ、 'true'または'false'になります。リクエストの後、ロードされたすべての行がis_exported = 'false'で更新されます。

この列テーブルを 10 分ごとにポーリングし、新しい行が表示されるたびにエクスポートしています。

しかし、ここに問題があります。このクエリの時間は、列テーブルのデータ量に比例して大きくなり、現在、5000 行を見つけるのに 12 秒から 20 秒 (!!!)かかります。私の理解では、インデックス付きリクエストは CF の行数に依存するのではなく、1 つのインデックス値 (基数) あたりの行数に依存する必要があります。これは、次のような別の非表示の CF であるためです。

    "true" : rowKey1 rowKey2 rowKey3 ...
    "false": rowKey1 rowKey2 rowKey3 ...

私は Pycassa を使用してデータをクエリしています。ここで使用しているコードは次のとおりです。

    column_family = pycassa.ColumnFamily(cassandra_pool, column_family_name, read_consistency_level=2)
    is_exported_expr = create_index_expression('is_exported', 'false')
    clause = create_index_clause([is_exported_expr], count = 5000)
    column_family.get_indexed_slices(clause)

私は何か間違ったことをしていますが、この操作ははるかに高速に動作することを期待しています。

アイデアや提案はありますか?

いくつかの設定情報:

  • カサンドラ 1.1.0
  • RandomPartitioner
  • 2 つのノードがあり、replication_factor = 2 (各サーバーには完全なデータ コピーがあります)
  • AWS EC2、大型インスタンスを使用
  • エフェメラル ドライブ上のソフトウェア raid0

前もって感謝します!

4

1 に答える 1

1

Cassandraでのインデックス作成の内部はわかりませんが、PostgreSQL / MySQLと同様に動作し、ブール値のインデックスを作成していたと想定しています。多くのシナリオでtrue/false列は冗長です。カーディナリティが低く(true&false = 2つの一意の値)、データが非常に均等に分散されている場合(たとえば、trueが50%、falseが50%)、データベースエンジンは全表スキャンを実行する可能性があります(インデックスを使用しません)。 )。

クエリの実行とデータセットのサイズの間の線形関係は、Cassandraが完全なテーブル(キースペース)スキャンを実行していることをさらにサポートします。

于 2012-08-28T19:02:24.997 に答える