Im Allgemeinen sollten Sie einen Index für die Felder erstellen, die am häufigsten als Filterkriterien in Ihren wichtigsten/häufigsten Abfragen verwendet werden, beginnend mit den selektivsten Feldern zuerst. Es gibt einige anständige Anleitungen zu diesem Thema als Teil der MongoDB-Dokumentation
. Eine Aussage von besonderem Interesse für Ihren Fall ist wahrscheinlich diese, da Sie viele $or
haben s:
Das Wichtigste hier ist jedoch das Messen, Messen, Messen und Betrachten von Abfrageausführungsplänen mithilfe von explain() . Der Grund dafür ist, dass Sie höchstwahrscheinlich verschiedene Arten von Abfragen haben, die Ihre Anwendung unterstützen muss, und Sie irgendwann einen Kompromiss eingehen müssen, bei dem Sie zwischen den Kosten für die Indexpflege wählen müssen (z. B. Schreibsperren während Indexaktualisierungen und Speicherplatzanforderungen) und die theoretisch schnellste Lösung, bei der alle in einer einzigen Abfrage verwendeten Felder von einem einzigen Index abgedeckt werden.
Das ganze Indizierungsthema ist etwas unscharf, was stark von Ihrem genauen Szenario abhängt:
- Werden Ihre Daten stark aktualisiert und müssen Schreibvorgänge superschnell sein (Sie möchten weniger/kleinere Indizes) oder sind Ihre Daten ziemlich stabil mit häufigen Lesevorgängen, die schnell sein müssen (wählen Sie mehr/größere Indizes)?
- Welche Arten von Abfragen müssen Sie unterstützen? Wie ähnlich sind sie sich in Bezug auf ihre Filter? Werden bestimmte Kombinationen von Filtern wahrscheinlicher sein als andere? Welche Abfragen müssen gut funktionieren, welche dürfen etwas langsamer sein?
- Wie werden die Daten in Ihren potenziell indizierten Feldern verteilt?
- und so weiter...
Sie werden nicht den einzigen Index finden, der all Ihren Abfragen hilft, die beste Leistung zu erzielen. Wenn Sie weitere Indizes hinzufügen oder vorhandene ändern, kann dies außerdem dazu führen, dass der Abfrageoptimierer einige Indizes für einige Abfragen nicht mehr verwendet und stattdessen einen anderen Ausführungsplan wählt, der möglicherweise erwünscht ist oder nicht. Messen Sie also alles, was wichtig ist, bei jeder Änderung Ihrer Indizierung oder Ihres physischen Datenlayouts (Hardware-Setup, Sharding ...). Schließlich sollten Sie Ihre Abfrageleistung regelmäßig messen, wenn Ihre Datenmenge wächst, es sei denn, die Verteilung ist vorhersehbar einheitlich.
Um es kurz zu machen:Wählen Sie einen iterativen Ansatz und fügen Sie zunächst einen Index hinzu (ich würde vorschlagen, einen auf isBlockedByAdmin
hinzuzufügen , isDelete
und information.shares.userId
) messen Sie dann Ihre Abfrageleistung und verfeinern Sie dann Ihren Index basierend auf Ihren Ergebnissen (und immer wieder ...).