MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Einfache MongoDB-Abfrage sehr langsam, obwohl Index gesetzt ist

Sie haben keinen Index, den Mongo automatisch dafür verwendet, also führt es einen vollständigen Tabellenscan durch.

Wie in den Dokumenten erwähnt

Warum

Wenn Sie einen Index auf a,b haben - und Sie suchen nach a allein - es wird automatisch ein Index verwendet. Dies liegt daran, dass dies der Beginn des Index ist (was schnell zu erledigen ist), die Datenbank kann den Rest des Indexwerts einfach ignorieren.

Ein Index auf a,b ist ineffizient bei der Suche nach b allein schon deshalb, weil es nicht die Möglichkeit gibt, die Indexsuche mit "starts with thisfixedstring" zu verwenden.

Also entweder:

  • Fügen Sie _reference_1_id in die Abfrage ein (wahrscheinlich irrelevant)
  • ODER fügen Sie einen Index für _reference_2_id hinzu (wenn Sie häufig nach dem Feld suchen)
  • ODER verwenden Sie einen Hinweis

Hinweis

Wahrscheinlich Ihre derzeit günstigste Option.

Fügen Sie einen Abfragehinweis hinzu, um die Verwendung Ihres _reference_1_id_1__reference_2_id_1_id_1 zu erzwingen Index. Das ist wahrscheinlich viel schneller als ein vollständiger Tabellenscan, aber immer noch viel langsamer als ein Index, der mit dem Feld beginnt, das Sie in der Abfrage verwenden.

d.h.

db.mycoll
    .find({"_reference_2_id" : ObjectId("jkl7890123456")})
    .hint("_reference_1_id_1__reference_2_id_1_id_1");