2014-01-15 3 views
0

У меня есть следующее Монго тест кластер вместоMongoDB низкой производительность запроса

  1. Нет черепки -2
  2. Нет в конфигурации сервера -1
  3. mongos экземпляры -2
  4. репликация не включена

У меня около 41 миллиона записей, разбитых по осколкам, я определил составной индекс {field1: 1, field2: 1, field3: 1}, мои запросы форма (поле = 1 и поле2 между x и y), я ожидал, что составной индекс будет полезен для этих запросов, однако время ответа на запрос составляет около 8 секунд для запроса, который я описал. Когда я выполняю поиск, я указываю только интересующие области.

Mongos установлен на машине, откуда я выполняю запрос, и я использую java для выполнения запроса.

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

Ниже приведен вывод объяснить команду

{ 
    "indexBounds": { 
     "LOGIN_ID": [ 
      [ 
       { 
        "$minElement": 1 
       }, 
       { 
        "$maxElement": 1 
       } 
      ] 
     ], 
     "LOGIN_TIME": [ 
      [ 
       1262332800000, 
       1293782400000 
      ] 
     ] 
    }, 
    "nYields": 7, 
    "millisShardTotal": 7410, 
    "millisShardAvg": 7410, 
    "numQueries": 1, 
    "nChunkSkips": 0, 
    "shards": { 
     "server1:27017": [ 
      { 
       "nYields": 7, 
       "nscannedAllPlans": 1769804, 
       "allPlans": [ 
        { 
         "cursor": "BtreeCursor LOGIN_TIME_1_LOGIN_ID_1", 
         "indexBounds": { 
          "LOGIN_ID": [ 
           [ 
            { 
             "$minElement": 1 
            }, 
            { 
             "$maxElement": 1 
            } 
           ] 
          ], 
          "LOGIN_TIME": [ 
           [ 
            1262332800000, 
            1293782400000 
           ] 
          ] 
         }, 
         "nscannedObjects": 1763903, 
         "nscanned": 1763903, 
         "n": 14081 
        }, 
        { 
         "cursor": "BasicCursor", 
         "indexBounds": {}, 
         "nscannedObjects": 5901, 
         "nscanned": 5901, 
         "n": 0 
        } 
       ], 
       "millis": 7410, 
       "nChunkSkips": 0, 
       "server": "server2:27017", 
       "n": 14081, 
       "cursor": "BtreeCursor LOGIN_TIME_1_LOGIN_ID_1", 
       "oldPlan": { 
        "cursor": "BtreeCursor LOGIN_TIME_1_LOGIN_ID_1", 
        "indexBounds": { 
         "LOGIN_ID": [ 
          [ 
           { 
            "$minElement": 1 
           }, 
           { 
            "$maxElement": 1 
           } 
          ] 
         ], 
         "LOGIN_TIME": [ 
          [ 
           1262332800000, 
           1293782400000 
          ] 
         ] 
        } 
       }, 
       "scanAndOrder": false, 
       "indexBounds": { 
        "LOGIN_ID": [ 
         [ 
          { 
           "$minElement": 1 
          }, 
          { 
           "$maxElement": 1 
          } 
         ] 
        ], 
        "LOGIN_TIME": [ 
         [ 
          1262332800000, 
          1293782400000 
         ] 
        ] 
       }, 
       "nscannedObjectsAllPlans": 1769804, 
       "isMultiKey": false, 
       "indexOnly": false, 
       "nscanned": 1763903, 
       "nscannedObjects": 1763903 
      } 
     ] 
    }, 
    "n": 14081, 
    "cursor": "BtreeCursor LOGIN_TIME_1_LOGIN_ID_1", 
    "oldPlan": { 
     "cursor": "BtreeCursor LOGIN_TIME_1_LOGIN_ID_1", 
     "indexBounds": { 
      "LOGIN_ID": [ 
       [ 
        { 
         "$minElement": 1 
        }, 
        { 
         "$maxElement": 1 
        } 
       ] 
      ], 
      "LOGIN_TIME": [ 
       [ 
        1262332800000, 
        1293782400000 
       ] 
      ] 
     } 
    }, 
    "numShards": 1, 
    "clusteredType": "ParallelSort", 
    "nscannedAllPlans": 1769804, 
    "nscannedObjectsAllPlans": 1769804, 
    "millis": 7438, 
    "nscanned": 1763903, 
    "nscannedObjects": 1763903 
} 

Образец документа в моей БД следующим образом

{ 
    "_id" : ObjectId("52d5192c1a45f84e48c24e2f"), 
    "LOGIN_ID" : <loginId>, 
    "LOGIN_TIME" : NumberLong("1372343932000"), 
    "BUSINESS_ID" : <businessId>, 
    "USER_ID" : <userid>, 
    "EMAIL" : "[email protected]", 
    "SITE_POD_NAME" : "x", 
    "USER_AGENT" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML. like  Gecko) Chrome/26.0.1410.43 Safari/537.31" 
    } 

Есть некоторые другие поля в приведенной выше документ, который я не могу разоблачить снаружи, но его простое значение ключа строки и строки

Вот как я запрашиваю db

DBObject dbObject = new BasicDBObject("BUSINESS_ID", businessId) 
     .append("LOGIN_TIME", 
new BasicDBObject("$gte",start).append("$lt", end)) 
    .append("LOGIN_TYPE", loginType); 

    long startTime = System.currentTimeMillis(); 
    DBObject keys = new BasicDBObject("LOGIN_TIME", 1); 
DBCursor find = collection.find(dbObject, keys); 

int count = 0; 
while (find.hasNext()) { 
    find.next(); 
    count++; 
} 
long endTime = System.currentTimeMillis(); 

Версия Mongo DB 2.4.9. Цените любую помощь.

+2

запустите 'explain' вашего запроса, а также добавить результаты на свой пост –

+2

кажется, что план запроса проверяет каждое значение login_id в индексе, в общей сложности почти 1.8M входа в систему записей. Можете ли вы добавить свой запрос и примерный документ. Кроме того, какую версию MongoDB вы используете? –

+0

Сколько документов возвращает этот запрос? Если он извлекает слишком много документов, попробуйте 'limit' –

ответ

0

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

  1. Что такое login_time и что числа в диапазоне запроса на самом деле означает? Диапазон выглядит довольно широким с помощью числовой разницы. Можете ли вы, чтобы критерии фильтрации были широко распространены? Это также указывает на «nscanned» из плана объяснения.

  2. Я вижу, что индекс находится на login_time и login_id, где ваш запрос находится в login_time и login_type. Просто высокое освещение, что, хотя вы используете индекс, ваши критерии запроса достаточно широки, чтобы охватить гораздо больший диапазон индексов, и поскольку второй критерий login_type не является частью индекса, запрос должен будет извлекать все «nscanned» документы для определения если это действительная запись для этого запроса.

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