私は現在、数百万のデータレコードでMongoDBを使用しています。かなり面倒なことが1つ見つかりました。
クエリされたデータコレクションの数が少ない場合に 'count()'関数を使用すると、非常に高速です。ただし、クエリされたデータコレクションに数千または数百万ものデータレコードが含まれている場合、システム全体が非常に遅くなります。
必須フィールドにインデックスを付けたことを確認しました。
誰かが同じものに遭遇しましたか?それをどのように改善しますか?
インデックスがディスクアクセスなしで実際に使用されていることを確認できます。
名前が「Andrei」のレコードをカウントするとします。
名前にインデックスを付けて(完了したように)、
db.users.find({name:"andrei"}, {_id:0, name:1}).count()
次のことをチェックすることで、それが最速のカウント方法であることを確認できます(事前計算を除く)。
db.users.find({name:"andrei"}, {_id:0, name:1}).explain()
trueに設定されたindex_onlyフィールドを表示します。
このトリックにより、クエリがディスクからではなくRAM(インデックス)からのみレコードを取得するようになります。
私にとっての解決策は、インデックスをsparseに変更することでした。特定の状況に依存しますが、可能であれば試してみてください。
db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } )
db.Account.find({
"dateChecked" : { $exists : true }
}).count()
コレクション内の318千件のレコード
あなたは今のところほとんど運がありません。mongodbの数はひどく、近い将来良くなることはありません。参照: https://jira.mongodb.org/browse/SERVER-1752
経験から、それが一度限りのものであるか、非常にまれにしか発生しないか、データベースがかなり小さい場合を除き、ほとんど使用しないでください。
@Andrew Orsichが述べたように、可能な限りカウンターを使用します(カウンターの低下はグローバルな書き込みロックですが、それでもcount()よりも優れています)。