2016-05-24 5 views
0

Я написал приложение, используя Sails.js с mongoDb (паруса-монго).Slow MongoDB запросы с Sails.js

Во-первых, я решил написать все в одном документ ... И базы данных замедлились на 5ГБЕ данных .. «Замедленная» означает, что основная находка запрос выполняется в 30-5ом ..

чем я переписать все в нескольких семействах и добавить индексацию .. пример моих моделей:

Markets.js

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

и 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' 
    } 
    } 
}; 

и пример медленного запроса

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

результат 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 
} 

Что вы можете посоветовать мне? Это около 2000 записей каждую минуту.

Как увеличить производительность? Изменить конфигурацию db? Изменить индексы? Изменить БД? Изменить конфигурацию моделей/коллекций?

Я с использованием 2-ядерный сервер с 2 Гб виртуальной памяти .. Извините за плохой английский ..

+0

Что вы на самом деле пытаетесь сделать? Похоже, вы смешиваете типы запросов; например использование предела в методе findOne не может ничего сделать ... –

+0

Actualy Limit .. является частью более старого запроса, где только что был найден. теперь его сняли .. –

+0

Часть его может быть ограничена сервер, на котором находится ваша база данных; в идеале вы хотите иметь достаточно памяти для хранения всей вашей базы данных + индексов в памяти, чтобы вы не получали ошибок страницы и т. д. Часть этого метода будет вызывать метод .populateAll(); это действительно дорого, особенно если у вас много записей, возвращаемых с начального шага .find(). Он может добавить * тысячи * дополнительных запросов и итераций в ваш запрос ... –

ответ

3

Существует недостаток в версии ватерлинии 0.12 при использовании MongoDB. По умолчанию ватерлиния не чувствительна к регистру, а mongodb - это!

Ваши запросы медленны, потому что при поиске строк используется REGEX для поиска любого случая, поэтому ваши индексы бесполезны. Но вы можете изменить его, отключив случай чуткость с атрибутом wlnex:

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

Вы можете подтвердить эту ошибку, проверяя на бревнах MongoDB. И посмотрите, что такое медленные запросы.

Смежные вопросы