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

mongodb индекси, покриващи липсващи стойности

Има две подходящи функции на индекс, които позволяват бързо търсене (в сравнение с извършването на сканиране на колекция):

  • Подреждане на стойностите
  • Компактност на индексираните стойности

Ако имате стойности a и b , можете да кажете, че a идва преди b , лексикографски. Ако имате документи {a: 2, b: 5} и {b: 4, a: 3} , няма единно подреждане на тези документи, което да удовлетвори типичните заявки. Например, ако искате всички от a подредени стойности, тогава може да очаквате 2, 3 , но ако искате b стойности, които може да очаквате 4, 5 - изискване редът на документи да бъде обърнат.

Когато базата данни съхранява индекса на диск, стойностите се съхраняват в индексен ред (каквото и да е това за конкретния индекс, напр. сортирането засяга това). Обикновено няма единична поръчка, която да може да се използва за документи за събиране като цяло, следователно документите за събиране не са подредени.

Когато правите заявка по индекс, вие вземате търсената стойност и по същество изпълнявате двоично търсене с помощта на индекса, тъй като данните в индекса са сортирани.

Втората причина да използвате индекса е, че ако сканирате колекцията, за всеки документ целият документ обикновено трябва да бъде извлечен от диска и прескочен. Ако имате колекция от 100 GB и извършвате сканиране, може да се наложи да пропуснете над 100 GB данни. Ако същата колекция има индекс от 100 MB за някое поле (тъй като индексът съхранява само стойностите в това поле, а не стойността на данните за целия документ), и базата данни извършва пълно сканиране на индекса, тя трябва да премине само през 100 MB от данни.

Сега към вашия въпрос относно съхраняването на липса на стойности в индекс.

От гледна точка на индекса, "липса на стойност" в различни документи е една и съща стойност. Губите способността да извършвате двоично търсене, когато всичките ви стойности са идентични. Така че, ако търсите този документ с „липса на стойност“, индексът ще ви върне всички документи в колекцията, на които липсва стойността, и след това трябва да направите сканиране през тях така или иначе, за да филтрирате по каквито и други условия да изберете имат. Тъй като това обикновено води до лоша селективност, базите данни не се занимават с индекси и правят сканиране на колекции на първо място.

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да заявите BsonExtraElements в MongoDB чрез Linq

  2. как да актуализирате числово поле, като използвате друго числово поле в MongoDB

  3. Как да регистрирам заявките си в MongoDB C# Driver 2.0?

  4. Най-бързият MongoDB на Azure!

  5. mongodb заместващ знак съответства на всички стойности за конкретен ключ