いくつかの CouchDB データベースがあります。最大のものは約 60 万ドキュメントで、クエリが法外に長い (数時間以上) ことがわかりました。DB の更新頻度は低く (1 か月に 1 回程度)、新しいドキュメントを追加するだけで、既存のドキュメントを更新することはありません。
クエリのタイプは次のとおりです: Find all documents where key1='a'
or multiple keys: key1='a', key2='b'
...
ここでは永続的なビューが実用的であるとは思わないので、CouchDB-Python の「クエリ」メソッドを使用しています。
いくつかのアプローチを試しましたが、何が最も効率的か、またはその理由がわかりません。
方法 1: map 関数は次のとおりです。
map_fun = '''function(doc){
if(doc.key1=='a'){
emit(doc.A, [doc.B, doc.C,doc.D,doc.E]);
}
}'''
Python クエリは次のとおりです。 results = ui.db.query(map_fun, key2=user)
次に、results.rows を使用した操作。これが一番時間がかかります。
「results.rows」が戻ってくるまでに約 1 時間かかります。key2 を別のものに変更すると、約 5 秒で元に戻ります。元のユーザーを繰り返すと、それも高速です。
ただし、より多くのキーを照会する必要がある場合があるため、次のことを試します。
map_fun = '''function(doc){
if(doc.key1=='a' && doc.key2=user && doc.key3='something else' && etc.){
emit(doc.A, [doc.B, doc.C,doc.D,doc.E]);
}
}'''
Pythonクエリを使用します:
results = ui.db.query(map_fun) 次に、results.rows を使用した操作
最初のクエリに時間がかかります。key2 を変更すると、また時間がかかります。key2 を元のデータに戻すと、同じ時間がかかります。(つまり、何もキャッシュされたり、B ツリー化されたりしていないようです)。
私の質問は次のとおりです。クエリがアドホックで、検索条件に複数のキーが含まれる場合、couchdb-python でクエリを実行する最も効率的な方法は何ですか?
UI は QT ベースで、その下に PyQt を使用しています。