Как я могу ускорить очень медленный запрос MongoDB?

#python #python-3.x #mongodb

#python #python-3.x #mongodb

Вопрос:

Я выполняю запрос на массовую запись MongoDB в цикле из примерно 300 записей json каждый раз. У меня есть update() функция и список, для каждого элемента в списке update() вызывается, и каждое выполнение должно выполнять запрос на массовую запись из 300 запросов на ввод.

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

 MyList = [1, 2, 3, 4, 5 ...]

def update():
    Queries = 
       [
          [{'Unix': 1596873600.0, 'market': 'TEST'}, {'$set': {'Unix': 1596873600.0, 'O': '11586.08000000', 'H': '11801.72000000', 'L': '11562.17000000', 'C': '11775.52000000', 'V': '9066.55659000', 'market': 'TEST'}, 'upsert': True}], 
          [{'Unix': 1596888000.0, 'market': 'TEST'}, {'$set': {'Unix': 1596888000.0, 'O': '11775.52000000', 'H': '11808.27000000', 'L': '11706.39000000', 'C': '11738.10000000', 'V': '6628.24686700', 'market': 'TEST'}, 'upsert': True}],
          ... 
       ] #Total length is 300
    
    db['myCol'].bulk_write(Queries)


for x in MyList:
    update()
  

Проблема с этим кодом заключается в том, что выполнение каждого вызова update() занимает слишком много времени; мало того, время выполнения увеличивается, пока MyList выполняется цикл.

Таким образом, сначала для каждого запроса потребуется около 1 секунды, но он увеличится до 3/4 секунды для запроса на полпути по списку. Теперь здесь есть две проблемы: не слишком ли много одной секунды для объемной операции с 300 документами? И почему время выполнения увеличивается до 3/4 секунды?

Вот еще несколько деталей:

  1. Я отслеживаю время, которое требуется с помощью простого print(f'Time: {end - start}')
  2. Unix и market являются ли индексы
  3. База данных, к которой я запрашиваю, размещена на другом сервере, а не на моем локальном компьютере.

Это нормальное время выполнения? Как я могу ускорить это? Приветствуются любые советы.

Комментарии:

1. Убедитесь, что вы используете составные индексы docs.mongodb.com/manual/core/index-compound затем вернитесь сюда, если это не помогло

2. Я не знаком с python, однако похоже, что вы запускаете один и тот же upsert много раз снова и снова: один раз с помощью bulk_write и еще раз с помощью for x in MyList: update() .

3. @DanielF время выполнения, похоже, сейчас составляет от 0,9 до 1,3 секунды, так что это улучшение! Сейчас я пытаюсь проверить, почему каждый запрос занимает так много времени

4. Убедитесь, что у вас есть составной индекс с полями в правильном порядке сортировки, это важно. Если вы не можете его улучшить, в oredered=False методе все еще есть bulk_write опция. Это ускорит вставки, но ваше _id поле больше не будет представлять порядок документов в вставляемом массиве.

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