2013-11-23 4 views
1

Я запускаю стандартную установку Homebrew Mongo DB версии 2.4.6, и у меня есть база данных с коллекцией под названием «items», в которой есть 600k документов.Общие сведения об общей производительности MongoDB

Я написал следующий запрос, чтобы найти лучшие пять брендов для сбора предметов:

db.items.aggregate([ 
    { $group: { _id: '$brand', size: { $sum: 1}}}, 
    { $sort: {"size": -1}}, 
    { $limit: 5} 
]) 

, который возвращает результат я ожидал, но, чтобы быть откровенным, занимает гораздо больше времени, чем я никогда бы не подумал. Вот данные профиля:

{ 
    "op" : "command", 
    "ns" : "insights-development.$cmd", 
    "command" : { 
      "aggregate" : "items", 
      "pipeline" : [ 
        { 
          "$group" : { 
            "_id" : "$brand", 
            "size" : { 
              "$sum" : 1 
            } 
          } 
        }, 
        { 
          "$sort" : { 
            "size" : -1 
          } 
        }, 
        { 
          "$limit" : 5 
        } 
      ] 
    }, 
    "ntoreturn" : 1, 
    "keyUpdates" : 0, 
    "numYield" : 3, 
    "lockStats" : { 
      "timeLockedMicros" : { 
        "r" : NumberLong(3581974), 
        "w" : NumberLong(0) 
      }, 
      "timeAcquiringMicros" : { 
        "r" : NumberLong(1314151), 
        "w" : NumberLong(10) 
      } 
    }, 
    "responseLength" : 267, 
    "millis" : 2275, 
    "ts" : ISODate("2013-11-23T18:16:33.886Z"), 
    "client" : "127.0.0.1", 
    "allUsers" : [ ], 
    "user" : "" 
} 

Вот ouptut из db.items.stats():

{ 
    "sharded" : false, 
    "primary" : "a59aff30810b066bbe31d1fae79596af", 
    "ns" : "insights-development.items", 
    "count" : 640590, 
    "size" : 454491840, 
    "avgObjSize" : 709.4894394230319, 
    "storageSize" : 576061440, 
    "numExtents" : 14, 
    "nindexes" : 10, 
    "lastExtentSize" : 156225536, 
    "paddingFactor" : 1, 
    "systemFlags" : 1, 
    "userFlags" : 0, 
    "totalIndexSize" : 165923744, 
    "indexSizes" : { 
      "_id_" : 17889088, 
      "demographic_1" : 14741328, 
      "brand_1" : 17946320, 
      "retailer_1" : 18690336, 
      "color_1" : 15738800, 
      "style_1" : 18951968, 
      "classification_1" : 15019312, 
      "placement_1" : 19107312, 
      "state_1" : 12394816, 
      "gender_1" : 15444464 
    }, 
    "ok" : 1 
} 

Я довольно новыми для MongoDB, так что я надеюсь кто-то может указать, почему это агрегирование занимает так много времени, чтобы и если есть что-то, что я могу сделать, чтобы ускорить его, так как мне кажется, что 600 тыс. не является огромным количеством документов, больше монго для выполнения расчетов.

+0

Сколько уникальных 'брендов' у вас есть? – WiredPrairie

+0

@WiredPrairie ~ 26k уникальные бренды. – TheDelChop

+1

db.serverStatus здесь не так полезен, как насчет db.items.stats()? –

ответ

2

Если у вас есть указатель на поле «бренд», то добавление в начале конвейера может помочь в производительности. Причина, по которой вы не видите хорошей производительности прямо сейчас, скорее всего, связана с необходимостью сканирования каждого документа в группу по бренду. Если был индекс, то его можно было бы использовать только для сканирования индекса, а не для всех документов. И сортировка (которая использует индекс) может ускорить группировку в некоторых случаях, когда результат, упорядоченный сгруппированным полем, полезен.

Если вы создали индекс на brand и не видели улучшения, попробуйте добавить $sort, прежде чем вы избавитесь от индекса. Если произойдет, что у вас уже есть индекс, где brand - это первое поле, вам не нужно добавлять еще один индекс на brand - составной индекс будет автоматически использоваться.

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