Warum verwendet MongoDB keine Indexüberschneidung?

9

Ich versuche, das erste Beispiel einer Indexkreuzungsanweisung ( Ссылка ) zu reproduzieren, aber mit einer Problem: Mongo verwendet nicht beide Indizes

Meine Schritte:

  1. Lade mongo (3.0.3) herunter und installiere es
  2. Führen Sie mongod: mongod.exe --dbpath d: \ data aus (der Ordner ist leer)
  3. Führen Sie mongo: mongo.exe
  4. aus
  5. Indizes hinzufügen:

    %Vor%
  6. Abfrage überprüfen erklären:

    %Vor%

Wie Sie sehen können, enthält der winingPlan nur den index item_1. Es gibt rejectedPlans, die den Index qty_1 enthalten. Aber es gibt keine Pläne, die Indexschnittstellen enthalten. Ich weiß, dass es viele Bedingungen gibt, um einen bestimmten Index auszuwählen. Aber in meinem Fall plant Mongo es nicht einmal!

Könnte mir jemand helfen?

    
Alexander 03.06.2015, 17:22
quelle

2 Antworten

3

Es gibt einige Details zur Indexauswahl im SERVER-3071 JIRA-Problem , aber ich kann nicht sagen, ob alles noch relevant für 3.0 ist. Jedenfalls:

MongoDB 3.0.2 scheint die Indexinteraktion für die Abfrage range nicht zu berücksichtigen. Aber es wird für Punkt-Intervalle:

%Vor%     
Sylvain Leroux 03.06.2015, 18:56
quelle
1

Wir betreiben eine Multi-Tenant-Site. So gibt es eine Mongo-Sammlung, die Informationen über alle Kunden enthält, zum Beispiel

%Vor%

Nachdem wir über die Indexüberschneidung erfahren hatten, haben wir versucht, mehrere einzelne Feldindizes zu erstellen, um Abfragen mit verschiedenen Suchkriterien mit variablen Feldern wie

zu unterstützen %Vor%

Aber es stellte sich einfach heraus, dass kein Schnittpunkt vorlag, indem wir von "db.collection.explain" lernten. Da die Felder begrenzt sind, haben wir uns schließlich für eine Lösung entschieden, um einen zusammengesetzten Index zu erstellen, der alle Felder enthält.

%Vor%

Und dann stellte sich heraus, dass unter allen Abfragen der "große" Compound-Index verwendet wird, soweit sich "customerId" in der Abfrage befindet.

%Vor%     
Popeye 30.06.2017 08:31
quelle