@Snoz3f

Как ускорить count в mongoose?

Приветствую. Есть вот такой код, который ищет по одному или двум текстовым полям, зависит от инпута пользователя.

const query = {
  a: ["some value"]
}

await this.FileModel.find(
      query,
      null,
      { limit: 50, skip: skipValue },
    )
      .lean()
      .sort({ file_create_time: -1 })
      .lean();

Все заключается в том, что с индексацией этот код работает довольно быстро, но есть несколько моментов, которые очень замедляют реквесты:
1. Если пролистать до старых страниц, допустим до 5000 страницы, то это происходит очень долго(примерно 10 секунд, даже с индексацией)
2. Count работает супер медленно, если брать загрузку самых свежих страниц, без него они загружаются за 15мс, но при использовании count (даже при условии того, что кол-во страниц ограниченно 5000, больше не нужно), задержка увеличивается до 3-5 секунд

Еще важно отметить то, что все очень медленно, при поиске по одному значению. По двум, все также происходит быстро.
Вот код вызова count():

await this.FileModel.find(query, null, {
            sort: { file_create_time: -1 },
            limit: 5000 * 50,
          })
            .count()


Код индексации:
FileSchema.index({
  a: 1,
  b: 1,
});


Как этот момент можно оптимизировать?
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Если пролистать до старых страниц, допустим до 5000 страницы, то это происходит очень долго(примерно 10 секунд, даже с индексацией)


Это нормально. 5000 за 10 секунд - это 500 страниц в секунду. Ни один человек так быстро читать не умеет.
Если пользователь давит pagedown - то наверное он что-то не так делает. Дай ему опцию goto номер
страницы.

Count работает супер медленно, если брать загрузку самых свежих страниц, без него они загружаются за 15мс, но при использовании count (даже при условии того, что кол-во страниц ограниченно 5000, больше не нужно), задержка увеличивается до 3-5 секунд


Это нормально. Ни в одной БД count не работает достаточно быстро чтобы показывать реал-тайм.
Вообще если вспомнишь что базы бывают ACID то они считают не актуальное состояние таблицы
а "срез таблицы в прошлом" на момент начала тразнакции подсчета.

Запоминай последнее значение count в переменную и транслируй пользователю внизу странички
как актуальное но в прошлом. Например 15 минут назад.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы