2016-11-23 4 views
6

Brauchen Sie Ihre Hilfe in den folgenden Dingen:MongoDB. Warum werden Anfragen vom Index so langsam ausgeführt?

Ich habe eine MongoDB Sammlung, die mehr als 26 Millionen Dokumente enthält. Dokumentstruktur konstant ist (pastebin.com/iBzW0Fkz)

Die Sammlung einen Index für die "Benutzer" Feld enthält

db.conversations.getIndexes(); 

RESULT - pastebin.com/xHecpw00

Alle Anfragen für das Feld " Benutzer“werden sehr langsam ausgeführt (mehr als 100 ms)

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

EXPLAIN - pastebin.com/0C11Cr9F

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

EXPLAIN - pastebin.com/CmvuDf10

Die Liste der Fragen:

  1. Warum Anfragen durch den Index so langsam durchgeführt werden?
  2. Wie Indizes nach dem Neustart von mongodb Server oder Prozess zu aktualisieren? Die Touch() - Anweisung ist in der WiredTiger-Engine nicht mehr verfügbar.

Hier ist eine zusätzliche Info

db.stats(); 

RESULT - pastebin.com/9JZF8ChQ

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

RESULT - pastebin.com/17yV4Fsi

db.conversations.getIndexes(); 

RESULT - Pastebin .com/xHecpw00

Info über den Server:

lscpu - pastebin.com/k7wUE4gH

lshw -kurzes - pastebin.com/w5XYuY3U

eine Annahme Es ist, das den Betrieb von HDD lesen ist Ein Flaschenhals und eine SSD können dieses Problem lösen, aber es gibt keine Möglichkeit, es zu testen.

Vielen Dank im Voraus.

Antwort

0
  1. Ich denke, das Problem ist, dass Sie eine Menge Daten haben.
  2. Ihr Index bezieht sich auf das Array-Feld, was nicht effektiv ist, da Ihr Index sehr groß wird, da MongoDB jeden Wert des Arrays indexiert, so dass Sie einzelne Elemente abfragen können.

Möglicherweise möchten Sie in sharding aussehen Ihre Daten über mehrere Instanzen zu teilen, aber beachten Sie, dass Sie nicht users field as shard key

abholen können