CouchDB でインデックス更新をスケジュールするにはどうすればよいですか
質問
私が理解している限り、CouchDB インデックスはビューがクエリされると更新されます。書き込みよりも読み取りの方が多いと仮定すると、これはスケーリングに悪くないでしょうか?書き込み時にインデックスを更新するように、あるいはできればスケジュールに従ってインデックスを更新するように CouchDB を構成するにはどうすればよいでしょうか?
解決
CouchDB は更新時にビューを再生成しますが、それはビューへの最後の読み取りアクセス以降に変更された内容のみです。読み取り量が書き込み量を大幅に上回っていると仮定すると、これは問題にはなりません。
多数のドキュメントを一度に変更すると、最初の読み取りリクエストにかなりの時間がかかる可能性があります。これを軽減するために、いくつかの異なる可能性が提案されています。ほとんどは、CouchDB の更新通知への登録と読み取りの自動トリガーに依存しています。
まさにそれを行うためのサンプル スクリプトは、CouchDB wiki ([1]) で入手できます。
他のヒント
a) 「スケーリング」という言葉は、あまりにも過大な用語です。どのような「種類」のスケーリングを指しているのでしょうか?(いずれにせよ、それがあなたにどのような悪影響を与えるかはわかりません)。
b) 書き込みに関する更新:書き込み後にビューをクエリするだけです。インデックスに大量のデータを追加すると、リソースがより使いやすくなることに注意してください (これは CouchDB に固有のことではありません)。したがって、N 回の書き込みごとにビューをトリガーしたい場合があります。
c) 予定:M 分ごとにビューをクエリする cron ジョブを設定します。
d) CouchDB が進化して、構成パラメータを使用してこれを設定できるインフラストラクチャが提供されるまで待ちます。
e) (最良のオプション)。ぜひ、CouchDB の磨き上げにご協力ください。あらゆる貢献を高く評価します。
それはできませんし、なぜそれを望むのでしょうか?
次のように考えてください。
- データを MySQL にインポートする場合は、インデックスを無効にすることができます。これは、1 回の実行で 100 回の書き込み (またはインポートする行の数) に対してインデックスを更新するよりも、挿入する行ごとにインデックスを更新する方がコストがかかるためです。
- これが、CouchDB が読み取り時にインデックスを更新する理由です。これらの 100 個の変更を同時に統合し、各変更を書き込み時に統合する方がコストが低くなるからです。
これは CouchDB の利点の 1 つです。:) これが CouchDB のみの機能だと言っているわけではありませんが、読み取り時にこれを実行するのが賢明です。
できることの 1 つは、update=false を指定して読み取ることです。これはダーティ読み取りであり、期待どおりの結果が返されない可能性があります。常にこれを行う場合は、cronjob による「定期的な」読み取りをスケジュールし、それによってインデックスを更新できます。それは意味がないと思います。