2016-11-23 8 views
6

MongoDB。なぜインデックスによるリクエストが非常に遅いのですか?

私は2600万件以上のドキュメントを含むMongoDBコレクションを持っています。 文書の構造が一定である(pastebin.com/iBzW0Fkz)は

コレクションは、 "ユーザー" フィールド

db.conversations.getIndexes(); 

結果にインデックス含まれています - pastebin.com/xHecpw00

フィールドのすべての要求を "ユーザが」実行される非常に遅い(100ms以上)

db.getCollection('conversations').find({users: {$all: ["5942328", "9082468"]}}); 

がEXPLAIN - pastebin.com/0C11Cr9F

db.getCollection('conversations').find({users: "9163099"}); 

EXPLAIN - pastebin.com/CmvuDf10

質問のリスト:

  1. をなぜインデックスの要請がそのようにゆっくりと行っていますか?
  2. mongodbサーバーまたはプロセスの再起動後にインデックスをウォームアップする方法はありますか? Touch()命令はWiredTigerエンジンでは使用できなくなりました。

ここでは、追加情報

db.stats(); 

結果である - pastebin.com/9JZF8ChQ

db.getCollection('conversations').stats(); 

RESULT - pastebin.com/17yV4Fsi

db.conversations.getIndexes(); 

RESULT - ペーストビン.com/xHecpw00

サーバーに関する情報:

lscpuから -short pastebin.com/k7wUE4gH

lshw - pastebin.com/w5XYuY3U

HDDからの読み出し動作の前提がありますですボトルネックとSSDがこの問題を解決するかもしれませんが、テストする機会はありません。

ありがとうございます。

答えて

0
  1. 私は問題は、あなたは多くのデータを持っていると思います。
  2. あなたのインデックスは配列フィールドにあります。MongoDBが配列の各値にインデックスを付けるのでインデックスが非常に大きくなり、個々のアイテムを問い合わせることができるので効果的ではありません。
あなたが複数のインスタンス間でデータを分割するシャーディングに見えますが、あなたが選ぶことができないことに注意する必要があり

users field as shard key

関連する問題