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

Изграждането на голям индекс на MongoDB е много бавно

Погрешни схващания

Скорост

Дори когато не говорим за многоключов индекс, ето какво се случва. Провежда се масивно сканиране на масата. Така че mongoDB обикаля документите, опитва се да намери полето, което да бъде индексирано, оценява това поле (до null ако не съществува в текущия документ) и записва констатациите си в не по-малко от 6 файла, тъй като говорим за 6 индекса. Като направим изчисление:200.000.000 / 86400 * 5 ни казва, че mongoDB прави това за приблизително 460 документа в секунда или се нуждае само от 2,2 милисекунди на документ . Не бих го нарекъл бавно. Може да отнеме много време, но не е бавно.

{background:true}

Използването на този параметър не да ви заключи от базите данни. Точно обратното, което е ясно посочено в документите, както на раздел за създаване на индекс и в обучителния раздел за създаване на индекси във фонов режим . Има обаче изречение, което лесно може да бъде изтълкувано погрешно:

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

Начини за подобряване (в бъдеще)

Разбит клъстер

Използвайте споделен клъстер с фрагменти от набор от реплики. Той е лесен за настройка и има множество предимства освен подобрената производителност. Един от тях е лесното мащабиране, добавянето на шард (и по този начин добавянето на пространство и изчислителна мощност към клъстер) е много лесно. Архивирането има по-малко влияние върху приложението. Вече няма нито една точка на отказ (когато се направи правилно, това се отнася дори за прекъсвания в мащаба на цял център за данни).

Използвайте различна файлова система

За съжаление, стартирането на дисково io-зависимо от производителността приложение на Windows Server няма смисъл за мен - изобщо. ExtFS4 или XFS са между 25% и 40% по-бързи от NTFS или ReFS, в зависимост от оптимизацията. Това прави естински разлика в приложенията, които зависят от IO на диска като вашия случай на употреба. Говорим за няколко дни (дори без да вземем предвид по-ефективното картографиране на паметта и намаленото потребление на памет от операционната система на Linux системи).

{background:true}

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

Странична бележка :Това е Лоша идея™ , за вертикално мащабиране при използване на mongoDB, тъй като е изрично проектиран да се мащабира хоризонтално. Това важи особено за големи колекции като вашата, тъй като паралелната обработка би подобрила значително производителността на вашето приложение.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да извлечете следващ и предишен елемент от текущия с Mongoose

  2. Използвайте низова променлива в LINQ ламбда израз

  3. Правилно използване на Electron

  4. Публикация на Meteor:Скриване на определени полета в поле на документ с масив?

  5. MongoError напишете EPIPE” в инсталацията на Parse-Server