Как оптимизировать производительность запроса путем изменения порядка заполнения, сортировки и ограничения - PullRequest
0 голосов
/ 17 апреля 2020

Требуется оптимизация для запросов к базе данных моего приложения Heroku: MongoDB, размещенная на Mongolab, содержит 2 миллиона документов (3,5 ГБ и более), теперь этот единственный запрос занимает в среднем 2,3 секунды, а Heroku возвращает тайм-ауты после 200 одновременных пользователи используют приложение.

Как оптимизировать этот запрос? Влияет ли порядок заполнения, сортировки и ограничения на производительность, можно ли их упорядочить по-разному? Вывод должен быть таким же, если перед заполнением происходит ограничение 100, как это можно сделать в этом коде?

Монголаб говорит, что с существующими индексами все в порядке, поэтому есть ли что-то сделать для самого кода?

  findcustomermydataResults = async (
    league: ILeague,
    user: IUser,
    minwp: number,
    maxwp: number
  ): Promise<ImydataResult[]> => {
    try {
      const mydataResultsInRange = await mydataresult.find(
        {
          league: league._id,
          wp: { $gte: minwp, $lte: maxwp },
          user: { $ne: user._id },
        },
        { user: 1, id: 1, wp: 1, mydata: 1, time: 1, createdAt: 1 }
      )
        .populate({
          path: "user",
          select: ["displayName", "country", "cargo", "customId", "chea"],
        })
        .sort({ createdAt: -1 })
        .limit(100);
      this.debug(
        `findcustomermydataResults() - found: ${
          mydataResultsInRange.length
        } mydata results`
      );
      return mydataResultsInRange;
    } catch (err) {
      this.error(`findcustomermydataResults() - try catch error: ${err}`);
      return null;
    }

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Попробуйте переместить заполнить в конец запроса. У вас уже есть необходимые данные для сортировки, просто выполнив начальный запрос. Таким образом, поиск по заполнителям должен ограничиваться только ожидаемыми 100 результатами, что резко повышает производительность.

  findcustomermydataResults = async (
    league: ILeague,
    user: IUser,
    minwp: number,
    maxwp: number
  ): Promise<ImydataResult[]> => {
    try {
      const mydataResultsInRange = await mydataresult.find(
        {
          league: league._id,
          wp: { $gte: minwp, $lte: maxwp },
          user: { $ne: user._id },
        },
        { user: 1, id: 1, wp: 1, mydata: 1, time: 1, createdAt: 1 }
      )
        .sort({ createdAt: -1 })
        .limit(100)
        .populate({
          path: "user",
          select: ["displayName", "country", "cargo", "customId", "chea"],
        });
      this.debug(
        `findcustomermydataResults() - found: ${
          mydataResultsInRange.length
        } mydata results`
      );
      return mydataResultsInRange;
    } catch (err) {
      this.error(`findcustomermydataResults() - try catch error: ${err}`);
      return null;
    }```
0 голосов
/ 22 апреля 2020

Добавление подсказки индекса к запросу сделало его в 100 раз быстрее

...