セカンダリ インデックスを持つ列ファミリーがあります。セカンダリ インデックスは基本的にバイナリ フィールドですが、文字列を使用しています。フィールドは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
前もって感謝します!