Ich habe mit MapReduce mit CouchDB herumgespielt. Einige der Beispiele zeigen eine möglicherweise schwere Logik innerhalb der Kartenreduzierungsfunktionen. In einem bestimmten Fall haben sie für Schleifen in der Karte ausgeführt.
Wird die Kartenreduzierung für jedes einzelne mögliche Dokument ausgeführt, bevor es die ausgewählten Dokumente ausgibt?
Wenn dem so ist, würde ich meinen, dass das Ausführen jeder Art von iterativer Verarbeitung innerhalb der Map-Reduce-Funktionen den Verarbeitungsaufwand um mindestens eine Größenordnung erhöhen würde.
Grundsätzlich läuft es auf die folgende Frage hinaus: wie viel Logik kann innerhalb der Karte durchgeführt werden, bevor es eine unvernünftig teure Abfrage reduziert?
In CouchDB map-reduce sind viele teure Prozesse akzeptabel.
CouchDB Ansichten (map-reduce) sind mehr wie CREATE INDEX
als sie SELECT FROM
sind.
Insbesondere garantiert CouchDB, dass eine Kartenfunktion nur einmal pro Dokument ausgeführt wird . (Nun, eigentlich einmal pro Dokument ändern schon mal.) Das ist es, was die "iterative Map-Reduce" ist.
Nehmen wir an, Sie hätten 10.000 Dokumente und nehmen jeweils 1 Sekunde zur Verarbeitung (was viel höher ist, als ich jemals gesehen habe). Das sind 10.000 Sekunden oder 2,8 Stunden, um die Ansicht vollständig zu erstellen. Sobald die Ansicht jedoch abgeschlossen ist, dauert die Abfrage einer beliebigen Zeile (?key=...
) oder jeder Zeilenscheibe ( ?startkey=...&endkey=...
) genauso lange wie die direkte Abfrage von Dokumenten. Die Nachschlagezeit ist O (log n) für die Beleganzahl.
Mit anderen Worten, selbst wenn es 1 Sekunde pro Dokument dauert, um die Karte auszuführen, wird es einige Millisekunden dauern, das Ergebnis zu holen. (Natürlich muss die Ansicht zuerst erstellt werden, da es sich tatsächlich um einen Index handelt.)
Das Abfragen der Datenbank ist eine nicht verwandte Aktivität aus der Zuordnung / Reduzierung eines Dokuments. Daher werden die Abfragekosten nicht durch die Komplexität der Karte / Reduzierung beeinflusst.
In couchdb werden Sie einen Index abfragen. Dies bedeutet, dass es sich um eine Kopie Ihrer Daten in einem für die Abfragegeschwindigkeit optimierten Format handelt. Eine Abfrage ist nicht wie ein Tablescan in SQL. Es werden keine Datensätze durchlaufen.
Wie machst du diesen Index? Dies geschieht über die Kartenfunktion. Die Kartenfunktion gibt einen Schlüssel und einen Wert aus. Der Schlüssel wird in den Index eingegeben. Einige komplizierte Kartenfunktionen, die Sie erwähnen, können viele Schlüssel und Werte wiederholen und ausgeben. Couchdb ist schlau und führt nur ein Dokument aus, wenn es nötig ist, normalerweise beim Erstellen, Aktualisieren und Löschen. Aus diesem Grund ist es inkrementelle Karte / reduzieren.
Wie Sie vielleicht sehen, kann eine komplizierte Kartenfunktion die Geschwindigkeit beim Erstellen, Aktualisieren und Löschen beeinträchtigen. Aber auch hier ist Couchdb so clever, dass Sie angeben können, wie alt die Daten bei der Indexabfrage sein könnten.