sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB stora index bygger mycket långsamt

Misuppfattningar

Hastighet

Även när man inte talar om ett multinyckelindex, är det här vad som händer. Det pågår en massiv tabellskanning. Så mongoDB itererar över dokumenten, försöker hitta fältet som ska indexeras, utvärderar det fältet (till null om det inte finns i det aktuella dokumentet) och skriver sina resultat till inte mindre än 6 filer eftersom vi talar om 6 index. Att räkna ut:200.000.000 / 86400 * 5 säger oss att mongoDB gör detta för ungefär 460 dokument per sekund eller behöver bara 2,2 millisekunder per dokument . Jag skulle inte kalla det långsamt. Det kan ta lång tid, men det är inte långsamt.

{background:true}

Att använda den här parametern inte låsa dig ute från databaserna. Tvärtom, vilket tydligt anges i dokumenten, både på Sektionen Skapa index och i sektionen för att skapa index i bakgrunden . Det finns dock en mening som lätt kan misstolkas:

Vad det betyder är att du inte kan utföra operationer som gäller alla databaser och kräver ett läs- eller skrivlås.

Sätt att förbättra (i framtiden)

Delad kluster

Använd ett delat kluster med replikuppsättningsskärvor. Det är lätt att installera och har flera fördelar förutom förbättrad prestanda. En av dem är enkel skalbarhet att lägga till en shard (och därmed lägga till utrymme och datorkraft till ett kluster) är mycket lätt. Säkerhetskopieringar har mindre inverkan på applikationen. Det finns inte en enda punkt av misslyckande längre (när det görs på rätt sätt, gäller detta till och med avbrott i storleken på ett helt datacenter).

Använd ett annat filsystem

Tyvärr, att köra en disk io prestandaberoende applikation på en Windows Server är inte meningsfullt för mig - alls. ExtFS4 eller XFS är mellan 25 % och 40 % snabbare än NTFS eller ReFS, beroende på optimeringen. Detta gör en verklig skillnad på applikationer som är lika disk-IO-beroende som ditt användningsfall. Vi talar om några dagar (inte ens med tanke på den mer effektiva minneskartläggningen och den minskade minnesförbrukningen för operativsystemet på Linux-system).

{background:true}

Även om detta inte verkligen förbättrar prestandan (det tar faktiskt längre tid att bygga index i bakgrunden av uppenbara skäl), men din applikation förblir tillgänglig under den tid som indexet byggs. Så beroende på dina behov kan detta vara ett genomförbart alternativ.

Sidoanteckning :Det är en Bad Idea™ , för att skala vertikalt när du använder mongoDB eftersom den uttryckligen utformades för att skalas horisontellt. Detta gäller speciellt för stora samlingar som din eftersom parallell bearbetning avsevärt skulle förbättra prestandan för din applikation.




  1. Slå upp med en rad objekt

  2. meteor/mongodb:Använd olika DB för autentisering och läs/skriv

  3. Spring data mongo paginering

  4. Undantag vid anslutning till mongodb in spark