Мы пытаемся создать приложение для уведомлений для наших пользователей с помощью mongo. мы создали 1 mongodb на 10GB RAM, 150GB SAS HDD 15K RPM, 4 Core 2.9GHZ xeon intel XEN VM.Производительность MongoDb медленная даже с использованием индекса
DB схемы: -
{
"_id" : ObjectId("5178c458e4b0e2f3cee77d47"),
"userId" : NumberLong(1574631),
"type" : 2,
"text" : "a user connected to B",
"status" : 0,
"createdDate" : ISODate("2013-04-25T05:51:19.995Z"),
"modifiedDate" : ISODate("2013-04-25T05:51:19.995Z"),
"metadata" : "{\"INVITEE_NAME\":\"2344\",\"INVITEE\":1232143,\"INVITE_SENDER\":1574476,\"INVITE_SENDER_NAME\":\"123213\"}",
"opType" : 1,
"actorId" : NumberLong(1574630),
"actorName" : "2344"
}
DB stats :-
db.stats()
{
"db" : "UserNotificationDev2",
"collections" : 3,
"objects" : 78597973,
"avgObjSize" : 489.00035699393925,
"dataSize" : 38434436856,
"storageSize" : 41501835008,
"numExtents" : 42,
"indexes" : 2,
"indexSize" : 4272393328,
"fileSize" : 49301946368,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"ok" : 1
}
индекс: - идентификатор пользователя и _ID
мы пытаемся выбрать последние 21 уведомлений для одного пользователя.
db.userNotification.find({ "userId" : 53 }).limit(21).sort({ "_id" : -1 });
, но этот запрос занимает слишком много времени. Пт Апр 26 05: 39: 55.563 [conn156] запрос UserNotificationDev2.userNotification query: {query: {userId: 53}, orderby: {_id: -1}} cursorid: 225321382318166794 ntoreturn: 21 ntoskip: 0 nscanned: 266025 keyUpdates: 0 Количество: 2 замка (микро) r: 4224498 нетто: 21 reslen: 10295 2581ms
даже счет занимает много времени.
Fri Apr 26 05:47:46.005 [conn159] command UserNotificationDev2.$cmd command: { count: "userNotification", query: { userId: 53 } } ntoreturn:1 keyUpdates:0 numYields: 11 locks(micros) r:9753890 reslen:48 5022ms
Мы делаем некоторые ошибки в запросе?
Пожалуйста, помогите !!!
Также укажите, не соответствует ли наша схема сохранению уведомлений пользователей. мы попробовали встроенные уведомления, такие как пользователь, а затем уведомление для этого пользователя в соответствии с этим документом, но ограничение документа ограничивает нас только уведомлением ~ 50 тыс. поэтому мы изменили это.
Вы можете запустить 'explain()' в своей находке, в частности 'db.userNotification.find ({" userId ": 53})' – cirrus
Можете ли вы запустить getIndexes() тоже? – cirrus