2017-12-26 10 views
0

Ich habe MongoDB Sammlung mit 50k + Dokumente wie:Was ist der beste Weg, um die Suche in MongoDB mit mehreren Indizes zu beschleunigen?

{ 
    "_id" : ObjectId("5a42190e806c3210acd3fa82"), 
    "start_time" : ISODate("2017-12-25T02:29:00.000Z"), 
    "system" : "GL", 
    "region" : "NY", 
    "order_id" : 3, 
    "task_type" : "px2", 
    "status" : false 
} 

Wenn ich einen neuen Auftrag, Skript sucht Datenbank Python hinzufügen für bestehende Aufträge mit derselben START_TIME und task_type, wie:

tasks_base.find_one({ 
    "$and": [{ 
     "start_time": plan_date.astimezone(pytz.UTC) 
    }, { 
     "task_type": px 
    }] 
    }) 

Es funktioniert , aber jedes neue Dokument in einer Sammlung verlangsamt es (mehr zu überprüfende Dokumente usw.). Als Lösung möchte ich task_type und start_time als Indizes für die Sammlung hinzufügen. Aber haben Sie einige Bedenken (Datum als Index sieht ein bisschen unnatürlich aus). Also, brauche einen Rat, wie man es richtig macht (oder zusätzliche Ideen, wie man die Suche beschleunigt). Für jeden Hinweis dankbar :)

Antwort

0

ich es mit 3 Schritten gelöst:

Zuerst habe ich erstellt einzigartige compound index:

tasks.create_index([("start_time", pymongo.ASCENDING,), ("task_proxy", pymongo.ASCENDING)], unique=True) 

Dann habe ich eingestellt Abfrage nur in Indexfeldern suchen (covered query):

all_tasks = tasks.find({ 
     "$and": [{ 
      "start_time": { 
       "$gte": plan_date.astimezone(pytz.UTC), 
       "$lt": plan_date.astimezone(pytz.UTC) + timedelta(hours=1) 
      } 
     }, { 
      "task_proxy": px 
     }] 
    }, {"_id": 0, "start_time": 1, "task_proxy": 1}) 

Last (gleicher Code oben), erhöhte ich die Größe der Zeitabfragen von 1 Minute bis 1 Stunde, so kann ich anstelle von 60 1 Datenbankoperation tun. Ich kann innerhalb Python-Skript mit den meisten der Daten arbeiten, so auf der Datenbank laden ist viel niedriger :)

UPD: rewrited 80% des Codes: Ich habe 1 Abfrage für jeden Auftrag, jetzt verwende ich 1 Abfrage für stündlich, finde dort freie Zeiträume und pack Bestellungen in freie Zellen (oder ziehe in eine andere Sammlung, wenn nicht genug Zellen vorhanden sind). Bei Verwendung des zusammengesetzten Indexes und der abgedeckten Abfrage wurde die Skript-Ausnahmezeit von 15-17 Sekunden auf 0,6 gesetzt.

Verwandte Themen