2016-11-23 90 views
6

在以下事情中需要您的幫助:MongoDB。爲什麼索引請求執行得如此緩慢?

我有一個MongoDB集合,其中包含超過26百萬個文檔。 文檔的結構是不變的(pastebin.com/iBzW0Fkz)

收集包括對 「用戶」 的索引字段

db.conversations.getIndexes(); 

RESULT - pastebin.com/xHecpw00

用於現場的所有請求「用戶」進行很慢(超過100毫秒)

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(); 

結果 - pastebin.com/17yV4Fsi

db.conversations.getIndexes(); 

結果 - 引擎收錄.com/xHecpw00

信息有關服務器:

lscpu - pastebin.com/k7wUE4gH

lshw -short - pastebin.com/w5XYuY3U

有從HDD讀取操作的假設是一個瓶頸和SSD可能會解決這個問題,但是沒有機會去測試它。

在此先感謝。

回答

0
  1. 我認爲問題是你有很多數據。
  2. 您的索引位於數組字段上,因爲索引變得非常大,因爲MongoDB索引數組的每個值,因此您可以查詢單個項目。

你可能要考慮拆分拆分跨多個實例數據,但請注意,你不能挑users field as shard key