MongoDB-Leistungsproblem: Einzelne große Sammlung im Vergleich zu mehreren kleinen Sammlungen

8

Ich habe zwei Szenarien getestet: Single-Enge-Collection und Multiple-Small-Collections. Dabei habe ich große Unterschiede in der Performance bei der Abfrage festgestellt. Hier ist was ich getan habe.

Fall 1: Ich habe eine Produktsammlung erstellt, die 10 Millionen Datensätze für 10 verschiedene Produkttypen enthält, und genau 1 Million Datensätze für jeden Produkttyp, und ich habe einen Index für ProductType erstellt. Wenn ich eine Beispielabfrage mit der Bedingung ProductType = 1 und ProductPrice & gt; 100 und Limit (10) ausgeführt habe, um 10 Datensätze von ProductType = 1 zurückzugeben, und dessen Preis größer als 100 ist, dauerte die Sammlung ca. 35 Millisekunden ist mehr als 100, und die gleiche Abfrage dauerte etwa 8000 Millisekunden (8 Sekunden), wenn wir eine sehr geringe Anzahl von Produkten in ProductType = 1 haben, deren Preis größer als 100 ist.

Fall 2: Ich habe für jeden Produkttyp 10 verschiedene Produkttabellen erstellt, die jeweils 1 Million Datensätze enthalten. In Sammlung 1, die Datensätze für ProductType 1 enthält, wenn ich dieselbe Beispielabfrage mit der Bedingung ProductPrice & gt; 100 und Limit (10) ausgeführt habe, um 10 Datensätze von Produkten zurückzugeben, deren Preis größer als 100 ist, dauerte es etwa 2,5 Millisekunden, wenn die Sammlung Lot hat von Produkten, deren Preis mehr als 100 ist, und die gleiche Abfrage dauerte etwa 1500 Millisekunden (1,5 Sekunden), wenn wir eine sehr geringe Anzahl von Produkten haben, deren Preis größer als 100 ist.

Warum gibt es also so viel Unterschied? Der einzige Unterschied zwischen dem ersten und zweiten Fall ist eine große Sammlung im Vergleich zu mehreren kleineren Sammlungen, aber ich habe den Index von ProductType im ersten Fall eine einzige große Sammlung erstellt. Ich denke, der Leistungsunterschied wird durch den Index im ersten Fall verursacht, und ich brauche diesen Index im ersten Fall, sonst wird er am schlechtesten in der Leistung sein. Ich habe im ersten Fall aufgrund des Indexes mit einer etwas langsamen Performance gerechnet, aber im ersten Fall habe ich nicht mit dem enormen Unterschied von etwa 10-mal gerechnet gerechnet.

Also 8000 Millisekunden vs 1500 Millisekunden bei einer großen Sammlung im Vergleich zu mehreren kleinen Sammlungen. Warum?

    
Anand Dayalan 17.07.2012, 01:14
quelle

1 Antwort

12

Durch das Trennen der Sammlungen erhalten Sie einen kostenlosen Index ohne echten Overhead. Es gibt einen Overhead für einen Index-Scan, besonders wenn der Index nicht wirklich hilft, die Anzahl der zu scannenden Ergebnisse zu reduzieren (wenn Sie eine Million Ergebnisse im Index haben, aber Sie müssen alle scannen und überprüfen, es wird dir nicht viel helfen).

Kurz gesagt, ist es eine gute Optimierung, sie voneinander zu trennen, aber Sie sollten Ihre Indizes besser für Ihre Abfragen machen, bevor Sie sich tatsächlich für diesen Weg entscheiden, was ich für eine drastische Maßnahme halte (ein Index für den Produktpreis könnte Ihnen mehr helfen) dieser Fall).

Mit explain () können Sie die Funktionsweise von Abfragen besser verstehen. Einige Grundlagen sind: Sie wollen ein niedriges nscaned zu n Verhältnis, ideal. Sie wollen nicht scanAndOrder = true und normalerweise nicht BasicCursor (das heißt, Sie verwenden überhaupt keinen Index).

    
Eve Freeman 17.07.2012, 01:40
quelle

Tags und Links