2016-05-24 18 views
0

Ich schrieb eine App mit Sails.js mit MongoDb (Segel-Mongo).Langsame MongoDB-Abfragen mit Sails.js

Zum einen habe ich beschlossen, alle zu einem einzigen Dokument zu schreiben ... und die Datenbank auf 5 GB Daten verlangsamt .. „Verlangsamte“ bedeutet, dass grundlegende Entdeckung Abfrage in 30-50s ausgeführt ..

als ich schreiben alle in einer mehr Sammlungen und fügt Indizierung .. Beispiel meiner Modelle:

Markets.js

module.exports = { 
     attributes: { 
     name: { 
      type: 'string', 
      index: true 
     }, 
     pairs: { 
     collection: 'Exchanges', 
     via: 'source', 
     } 
     } 
    }; 

und Exchanges.js

module.exports = { 

    attributes: { 
    s1: { 
     type: "string" 
    }, 
    source:{ 
     model: "Maklers", 
     index: true 
    }, 
    s2: { 
     type: "string" 
    }, 
    p: { 
     type: 'float' 
    }, 
    v1: { 
     type: 'float' 
    }, 
    v2: { 
     type: 'float' 
    }, 
    vb: { 
     type: 'float' 
    } 
    } 
}; 

und Beispiel für langsame Abfragen

Markets.findOne({ 
      name: info, 
      sort: 'createdAt DESC', 
      limit: 1, 
      createdAt: { 
      '<=': aft 
      } 
     }).populateAll().exec(function(err, items) { 
      callback(err, items); 
     }); 

Ergebnis db.stats

> db.stats() 
{ 
    "db" : "stats222", 
    "collections" : 8, 
    "objects" : 36620661, 
    "avgObjSize" : 238.26556139988844, 
    "dataSize" : 8725442352, 
    "storageSize" : 10033258480, 
    "numExtents" : 63, 
    "indexes" : 13, 
    "indexSize" : 2940024192, 
    "fileSize" : 14958985216, 
    "nsSizeMB" : 16, 
    "extentFreeList" : { 
     "num" : 0, 
     "totalSize" : 0 
    }, 
    "dataFileVersion" : { 
     "major" : 4, 
     "minor" : 22 
    }, 
    "ok" : 1 
} 

Was Sie mich beraten kann? Es ist etwa 2000 von Aufzeichnungen jede Minute ..

Wie Leistung steigern? Db-Konfiguration ändern? Indizes ändern? DB ändern? Ändern Sie die Konfiguration der Modelle/Sammlungen?

I unter Verwendung von 2-Core-Server mit 2 GB virtuellen Speichern .. Sorry für schlechtes Englisch ..

+0

Was versuchen Sie eigentlich? Es sieht so aus, als würden Sie Arten von Abfragen mischen. z.B. Die Verwendung eines Limits in einer findOne-Methode kann nichts bewirken ... –

+0

Aktualitätslimit .. ist Teil der älteren Abfrage, wo nur Suchen war. jetzt ist es entfernt .. –

+0

Teil davon können nur die Einschränkungen sein der Server, auf dem sich Ihre Datenbank befindet; Idealerweise möchten Sie genug Speicher haben, um Ihre gesamte Datenbank + Indizes im Speicher zu halten, so dass Sie keine Seitenfehler usw. bekommen. Ein Teil davon wird die .populateAll() Methode aufrufen; Das ist * wirklich * teuer, vor allem, wenn Sie viele Datensätze aus dem ursprünglichen Schritt .find() zurückgegeben haben. Es könnte * Tausende * zusätzliche Abfragen und Iterationen auf Ihre Abfrage hinzufügen ... –

Antwort

3

Es ist ein Nachteil in der 0,12-Version von der Wasserlinie, wenn mongodb verwenden. Standardmäßig ist Wasserlinie nicht Groß- und Kleinschreibung, und Mongodb ist!

Ihre Abfragen sind langsam, weil bei der Suche nach Zeichenfolgen ein REGEX verwendet wird, um einen beliebigen Fall zu finden, so dass Ihre Indizes nutzlos sind. Aber Sie können es ändern, indem Sie den Fall Empfindlichkeit mit dem wlnex Attribut zu deaktivieren:

someMongodbServer: { 
    adapter: 'sails-mongo', 
    host: 'mongodb', 
    port: 27017, 
    user: 'username', 
    password: 'password', 
    database: 'databaseCoolName', 
    wlNext: { 
     caseSensitive: true 
    } 
}, 

Sie diesen Fehler durch Prüfen auf die mongodb Protokolle bestätigen können. Und sehen Sie, was die langsamen Abfragen sind.