MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Агрегатният конвейер на MongoDB се бави след първата стъпка на съвпадение

ОТГОВОР 2019

Този отговор е за MongoDB 4.2

След като прочетох въпроса и дискусията между вас, вярвам, че проблемът е разрешен, но все пак оптимизацията е често срещан проблем за всички, които използват MongoDB.

Сблъсках се със същия проблем и ето съветите за оптимизиране на заявките.

Поправете ме, ако греша :)

1. Добавете индекс към колекцията

Индексите играят жизненоважна роля при бързото изпълнение на заявки, тъй като индексите са структури от данни, които могат да съхраняват набора от данни на колекцията във форма, която е лесна за преминаване. Заявките се изпълняват ефективно с помощта на индекси в MongoDB.

Можете да създадете различен тип индекси според вашите нужди. Научете повече за индексите тук, официалната документация на MongoDB.

2. Оптимизация на тръбопровода

  • Винаги използвайте $match преди $project , тъй като филтрите премахват допълнителни документи и полета от следващия етап.
  • Винаги помнете, че индексите се използват от $match и $sort . Така че опитайте да добавите индекс към полетата, в които ще сортирате или филтрирате документи.
  • Опитайте се да запазите тази последователност в заявката си, използвайте $sort преди $limit като $sort + $limit + $skip. Тъй като $sort се възползва от индекса и позволява на MongoDB да избере необходимия план за заявка, докато изпълнява заявката.
  • Винаги използвайте $limit преди $skip така че това пропускане ще бъде приложено за ограничаване на документи.
  • Използвайте $project за да върне само необходимите данни в следващия етап.
  • Винаги създайте индекс на атрибутите на externalField в $lookup . Освен това, тъй като търсенето произвежда масив, ние обикновено го развиваме на следващия етап. Така че, вместо да го развивате на следващия етап, развийте го в търсенето като:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Използвайте allowDiskUse в агрегирането, с помощта на него операциите за агрегиране могат да записват данни в поддиректорията _tmp в директорията Database Path. Използва се за изпълнение на голямата заявка във временна директория. Например:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Изградете отново индексите

Ако създавате и изтривате индекси доста често, изградете отново индексите си. Помага на MongoDB да опресни, по-рано съхранения план за заявка, кеша, който продължава да поема необходимия план за заявка, повярвайте ми, този проблем е гадно :(

4. Премахване на нежелани индекси

Твърде много индекси отнемат твърде много време в операцията Създаване, актуализиране и изтриване, тъй като те трябва да създадат индекс заедно със задачите си. Така че премахването им помага много.

5. Ограничителни документии

В реален сценарий извличането на пълни данни, присъстващи в базата данни, не помага. Освен това или не можете да го покажете, или потребителят не може да прочете пълните извлечени данни. Така че, вместо да извличате пълни данни, извличайте данни на парчета, което помага както на вас, така и на вашия клиент да гледате тези данни.

И накрая, гледането какъв план за изпълнение е избран от MongoDB, помага да разберете основния проблем. Така че $explain ще ви помогне да разберете това.

Надявам се, че това резюме ще ви помогне, момчета, не се колебайте да предлагате нови точки, ако съм пропуснал някоя. Ще ги добавя и тях.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да спрете изграждането на Runaway Index в MongoDB

  2. Как да получите краткото име на месеца в SQL

  3. Намерете документи, чието поле на масив съдържа поне n елемента от даден масив

  4. Намерете документ с масив, който съдържа конкретна стойност

  5. Производителност на MongoDB - има множество бази данни