Dies ist ein klassisches Zeit/Raum-Kompromiss.
Durch das Ausgeben von Dokumentendaten in den Index wird die Größe der Indexdatei auf der Festplatte erhöht, da CouchDB die ausgegebenen Daten direkt in die Indexdatei einfügt. Dies bedeutet jedoch, dass CouchDB beim Abfragen Ihrer Daten den Inhalt direkt aus der Indexdatei auf dem Datenträger streamen kann. Das ist offensichtlich ziemlich schnell.
Wenn Sie stattdessen auf include_docs=true
vertrauen, verringert sich die Größe Ihres Indexes auf der Festplatte. Bei der Abfrage muss CouchDB jedoch für jede zurückgegebene Zeile ein Dokument lesen. Dies beinhaltet im Wesentlichen zufällige Dokumenten-Lookups aus der Hauptdatendatei, was bedeutet, dass die Kosten und die Zeit der Rücksendung von Daten signifikant ansteigen.
Während der Zeitunterschied bei kleinen Dokumentenmengen langsam ist, summiert er sich bei jedem Aufruf der Anwendung. Für mich ist daher das Ausgeben von benötigten Feldern aus einem Dokument in den Index normalerweise der richtige Aufruf - die Platte ist billig, die Aufmerksamkeit des Benutzers ist weniger groß. Dies ist im Großen und Ganzen vergleichbar mit der Verwendung von Indizes in einer relationalen Datenbank, ein weiterer weithin geäußerter Ratschlag.
Ich tat eine völlig unwissenschaftliche test on this, um ein Gefühl dafür zu bekommen, was der Unterschied ist. Ich fand eine 8-fache Erhöhung der Antwortzeit und 50% Erhöhung der CPU bei Verwendung von include_docs=true
zum Lesen von 100.000 Dokumenten aus einer Ansicht im Vergleich zu einer Ansicht, in der die Dokumente direkt in den Index selbst ausgegeben wurden.
perfekt, danke. Ich erinnere mich, über die Race Condition gelesen zu haben, aber die Nebenwirkung des Einschließens des Docs in die Emission kam mir erst später in den Sinn. – kolosy