2016-05-13 8 views
0

Wenn ich eine Abfrage an meine Datenbank mit Python-Cloudant mit 3 Selektoren, die Abfrage dauert ~ 15 Sekunden zum Abschluss und Drucken von Ergebnissen. Wenn ich ein Limit von 2 eingeben (siehe Code unten), erscheint das Ergebnis sehr schnell, aber nach 2 dauert es viel länger. Derzeit befinden sich ~ 190.000 Dokumente in dieser Datenbank. Fehle ich etwas, das das beschleunigen kann?Python-Cloudant langsame Abfragegeschwindigkeit?

query = cloudant.query.Query(db,selector={'_id': {'$gt': 0},'userid':{'$eq':'56900'},'year':{'$eq':'[2011]'}},fields=['_id','userid','year'],sort=['_id'],limit=2) 
for doc in query()['docs']: 
    print doc 

(Das Ziel dieser Abfrage alle Datensätze aus der Benutzer-ID „56900“ zu erhalten, die „[2011]“ im Jahr Feld und sortieren sie durch die _id)

+0

Haben Sie Indizes für das Feld userId eingerichtet? Wenn nicht, riskieren Sie, dass die Datenbank einen vollständigen Scan aller Dokumente durchführt. – rhyshort

+0

@rhyshort Vielleicht nicht richtig. Ich habe folgendes aber es beschleunigt die Abfrage nicht: "json: Benutzer-ID, Jahr" { "type": "json", "def": { "Felder": [ { „userid „: "asc" }, { "Jahr": "asc" } – pynewb

+1

versuchen Vielleicht machen Sie das' '_id' zu entfernen: { '$ gt': 0} 'aus der Abfrage, iirc, die auslösen würde einen Scan seit du auf das _id-Feld schaust, das alle Docs haben – rhyshort

Antwort

1

sich nach den Kommentaren auf die Frage. Der Grund, warum es langsam ist, ist, dass der '_id': {'$gt': 0} Teil des Selektors bewirkt, dass alle Dokumente gescannt werden, um festzustellen, ob sie mit dem Rest des Selektors übereinstimmen. Diese Klausel zu entfernen und die Felder userid und year indiziert zu haben, hat einen massiven Anstieg.