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

Преглед на индексирането на база данни за MongoDB

Какво е индексиране?

Индексирането е важна концепция в света на базата данни. Основното предимство на създаването на индекс във всяко поле е по-бързият достъп до данни. Той оптимизира процеса на търсене и достъп до база данни. Разгледайте този пример, за да разберете това.

Когато някой потребител поиска конкретен ред от базата данни, какво ще направи DB системата? Той ще започне от първия ред и ще провери дали това е редът, който потребителят иска? Ако да, върнете този ред, в противен случай продължете да търсите реда до края.

Като цяло, когато дефинирате индекс за определено поле, системата на БД ще създаде подреден списък със стойността на това поле и ще го съхрани в различна таблица. Всеки запис в тази таблица ще сочи към съответните стойности в оригиналната таблица. Така че, когато потребителят се опита да търси който и да е ред, той първо ще търси стойността в индексната таблица, използвайки алгоритъм за двоично търсене и ще върне съответната стойност от оригиналната таблица. Този процес ще отнеме по-малко време, защото използваме двоично търсене вместо линейно.

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

Как да създадем индекс в MongoDB колекция?

За да създадете индекс с помощта на обвивка Mongo, можете да използвате този синтаксис:

db.collection.createIndex( <key and index type specification>, <options> )

Пример:

За да създадете индекс на полето за име в колекцията myColl:

db.myColl.createIndex( { name: -1 } )

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

  1. Индекс на _id по подразбиране

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

  2. Индекс на едно поле

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

    Пример:

    db.myColl.createIndex( { name: 1 } )

    Това ще създаде един ключов възходящ индекс в полето за име в колекцията myColl

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

    Можете също да създадете индекс за множество полета, като използвате сложни индекси. За този индекс има значение редът на полетата, в които са дефинирани в индекса. Помислете за този пример:

    db.myColl.createIndex({ name: 1, score: -1 })

    Този индекс първо ще сортира колекцията по име във възходящ ред и след това за всяка стойност на името ще сортира по стойности на резултата в низходящ ред.

  4. Multikey Index

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

    Помислете за този пример:

    {
    ‘userid’: 1,
    ‘name’: ‘mongo’,
    ‘addr’: [
        {zip: 12345, ...},
    {zip: 34567, ...}
    ]
    }

    Можете да създадете многоключов индекс в полето addr, като издадете тази команда в обвивката на Mongo.

    db.myColl.createIndex({ addr.zip: 1 })
  5. Геопространствен индекс

    Да предположим, че сте съхранили някои координати в колекцията на MongoDB. За да създадете индекс на полета от този тип (които имат геопространствени данни), можете да използвате геопространствен индекс. MongoDB поддържа два типа геопространствени индекси.

    • 2d индекс:Можете да използвате този индекс за данни, които се съхраняват като точки в 2D равнина.

      db.collection.createIndex( { <location field> : "2d" } )
    • 2dsphere Index:Използвайте този индекс, когато вашите данни се съхраняват като GeoJson формат или координатни двойки (дължина, ширина)

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Текстов указател

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

    Пример:

    db.myColl.createIndex( { address: "text" } )
  7. Хеширан индекс

    MongoDB поддържа базирано на хеш разделяне. Хешираният индекс изчислява хеша на стойностите на индексираното поле. Хешираният индекс поддържа разделяне с помощта на хеширани разчленени ключове. Хешираното разделяне използва този индекс като ключ за разделяне на данните във вашия клъстер.

    Пример:

    db.myColl.createIndex( { _id: "hashed" } )
Свойства на индекса
  1. Уникален индекс

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

  2. Разреден индекс

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

  3. TTL индекс

    Този индекс се използва за автоматично изтриване на документи от колекция след определен интервал от време (TTL). Това е идеално за премахване на документи от дневници на събития или потребителски сесии.

Анализ на производителността

Помислете за колекция от студентски резултати. В него има точно 3000000 документа. Не сме създали никакви индекси в тази колекция. Вижте това изображение по-долу, за да разберете схемата.

Примерни документи в колекция от партитури

Сега помислете за тази заявка без никакви индекси:

db.scores.find({ student: 585534 }).explain("executionStats")

Изпълнението на тази заявка отнема 1155 ms. Ето изхода. Потърсете полето executionTimeMillis за резултата.

Време за изпълнение без индексиране

Сега нека създадем индекс на студентското поле. За да създадете индекса, изпълнете тази заявка.

db.scores.createIndex({ student: 1 })

Сега същата заявка отнема 0 мс.

Време за изпълнение с индексиране

Можете ясно да видите разликата във времето за изпълнение. Това е почти мигновено. Това е силата на индексирането.

Заключение

Един очевиден извод е:Създайте индекси. Въз основа на вашите заявки можете да дефинирате различни типове индекси във вашите колекции. Ако не създавате индекси, тогава всяка заявка ще сканира пълните колекции, което отнема много време, което прави приложението ви много бавно и използва много ресурси на вашия сървър. От друга страна, също не създавайте твърде много индекси, защото създаването на ненужни индекси ще доведе до допълнителни разходи за време за всяко вмъкване, изтриване и актуализиране. Когато изпълнявате някоя от тези операции върху индексирано поле, тогава трябва да извършите същата операция и върху индексното дърво, което отнема време. Индексите се съхраняват в RAM, така че създаването на неподходящи индекси може да изяде вашето RAM пространство и да забави вашия сървър.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB агрегиране на Loopback

  2. Планирайте работата на Node.js на всеки пет минути

  3. Планиране и управление на схеми в MongoDB (дори въпреки че е безсхемно)

  4. Защо моите MongooseJS ObjectIds се провалят на теста за равенство?

  5. Вземете данни от колекция b, която не е в колекция a в заявка за обвивка на MongoDB