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

Разбиране на MongoDB индекси

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

Индекси на MongoDB

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

Когато създавате документ, MongoDB по подразбиране присвоява поле _id, ако не е посочено, и го прави уникален индекс за този документ. По принцип това е, за да се предотврати вмъкването на един и същ документ повече от тези в тази колекция. Освен това, за разделен клъстер е препоръчително да използвате това поле _id като част от избора на ключове за сегменти, в противен случай трябва да има известна уникалност на данните в полето _id, за да се избегнат грешки.

Създаване на индекс за колекция

Ако приемем, че сте вмъкнали някои данни във вашата колекция и искате да присвоите поле като индекс, можете да използвате метода createIndex, за да постигнете това, т.е.

Да приемем, че имате тези json данни:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Можем да направим полето Име в низходящ индекс чрез:

db.collection.createIndex({Name: -1})

Този метод създава индекс със същата спецификация, само че не съществува вече.

Типове индекси в MongoDB

MongoDB включва различни типове данни, следователно различни типове индекси се извличат, за да поддържат тези типове данни и заявки.

  1. Едно поле

    Използвайки едно поле на документ, можете да направите полето индекс във възходящ или низходящ начин, точно както в примера по-горе. Освен това можете да създадете индекс на вграден документ като цяло, например:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Полето за контакт е вграден документ, следователно можем да го направим възходящ индекс с командата:

    db.collection.createIndex({ Contact: 1})

    В заявка можем да извлечем документа като:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

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

  2. Сложен индекс

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

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Създаване на комбиниран индекс за примерните данни по-долу

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Съображения:

    • Може да се поддържа ограничение от само 32 полета.
    • Стойността на полето ще дефинира типа на индекса, т.е. 1 е нарастващ и -1 е низходящ.
    • Не създавайте съставни индекси, които имат хеширан тип индекс.
    • Редът на полетата, изброени в съставния индекс, е важен. Сортирането ще се извърши в съответствие с реда на полетата.
  3. Multikey Index

    В даден момент може да имате полета със съхранено съдържание на масив. Когато тези полета се индексират, се създават отделни записи в индекса за всеки елемент. Следователно това помага на заявката да избере документи, които се състоят от масиви чрез съпоставяне на елемент или елементи от масивите. Това се прави автоматично от MongoDB, следователно няма нужда да се посочва изрично типа мултиключ. От версия 3.4 MongoDB проследява кои индексирани полета карат индекс да бъде многоключов индекс. С това проследяване на машината за заявки към базата данни е разрешено да използва по-строги граници на индекса.

    Ограничения на многоключовия индекс

    • Само едно поле на масива може да се използва в индексирането с множество ключове за документ в колекцията. т.е. Не можете да създадете многоключов индекс за командата и данните по-долу
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Не можете да създадете многоключов индекс
      { nums: 1, scores: 1 } 
    • Ако многоключовият индекс вече съществува, не можете да вмъкнете документ, който нарушава това ограничение. Това означава, че имаме
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      След създаване на комбиниран многоключов индекс, опит за вмъкване на документ, където полетата с числа и резултати са масиви, базата данни ще провали вмъкването.
  4. Текстови индекси

    Текстовите индекси често се използват за подобряване на заявките за търсене на низ в колекция. Те не съхраняват специфични за езика стоп думи (т.е. „the“, „a“, „or“). Една колекция може да има най-много един текстов индекс. За да създадете текстов индекс:

    db.collection.createIndex({Name:”text”})

    Можете също да индексирате множество полета, т.е.

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Съставният индекс може да включва ключ за текстов индекс в комбинация с възходящ/низходящ индекс, но:

    • Всички ключове за текстови индекси трябва да са в съседство в документа със спецификация на индекса, когато създавате съставен текстов индекс.
    • В съставния текстов индекс не трябва да се включват никакви други специални типове индекси, като полета с многоключови индекси.
    • За да извършите търсене с $text, предикатът на заявката трябва да включва условия за съответствие на равенството на предходните ключове.
  5. Хеширани индекси

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

Общи оперативни съображения за индексите

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

Ограничения при използването на индекси

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

Заключение

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използване на множество бази данни Mongodb с Meteor.js

  2. как да групирате в mongoDB и да върнете всички полета в резултат

  3. Частична актуализация на поддокумент с nodejs/mongoose

  4. Поправете „$pullAll изисква аргумент за масив, но получи двоен“ в MongoDB

  5. MongoDB срещу MySQL