sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb-index som täcker saknade värden

Det finns två relevanta funktioner i ett index som tillåter snabba uppslagningar (jämfört med att utföra en insamlingsskanning):

  • Ordning av värden
  • Indexerade värden är kompakta

Om du har värden a och b , du kan säga att a kommer före b , lexikografiskt. Om du har dokument {a: 2, b: 5} och {b: 4, a: 3} , finns det ingen enskild beställning av dessa dokument som skulle tillfredsställa typiska frågor. Till exempel, om du vill ha alla a ordnade värden så kan du förvänta dig 2, 3 , men om du vill ha b värden du kan förvänta dig 4, 5 - kräver att dokumentordningen vänds.

När en databas lagrar indexet på disken, lagras värdena i indexordning (vad det än kan vara för det specifika indexet, t.ex. sammanställning påverkar detta). I allmänhet finns det ingen enskild beställning som är användbar för insamlingsdokument överlag, därför är insamlingsdokument oordnade.

När du frågar efter index tar du värdet som du söker och utför i huvudsak en binär sökning med hjälp av indexet eftersom data i indexet är sorterade.

Den andra anledningen till att använda indexet är, om du skannar samlingen, för varje dokument, måste hela dokumentet vanligtvis hämtas från disken och hoppa över. Om du har en samling på 100 GB och du gör en skanning kan du behöva hoppa över 100 GB data. Om samma samling har ett 100 MB index på något fält (eftersom indexet bara lagrar värdena i det fältet och inte hela dokumentets värde av data), och databasen utför en fullständig indexskanning, behöver den bara gå igenom 100 MB av data.

Nu till din fråga om att lagra brist på värden i ett index.

Ur indexets synvinkel är "avsaknaden av ett värde" i olika dokument samma värde. Du förlorar möjligheten att göra binär sökning när alla dina värden är identiska. Så om du letar efter det där "brist på värde"-dokumentet kommer indexet att ge dig tillbaka alla dokument i samlingen som saknar värdet, och sedan måste du göra en skanning genom dem ändå för att filtrera efter vilka andra förhållanden du än ha. Eftersom detta i allmänhet ger dålig selektivitet stör databaserna inte med index och gör samlingsskanningar i första hand.

Och troligtvis vill du ha några andra fält utanför din fråga, inte fältet som inte har ett värde. Så nu vill du att indexet ska lagra fullständiga dokument, vilket motverkar idén om kompakthet.




  1. Hur kan jag implementera behörigheter på fältnivå för MongoDB?

  2. Ett mer elegant sätt att hantera filtreringsvärden i Angular App

  3. Det gick inte att ansluta till MongoDB när .NET Core kördes på Linux

  4. Introduktion till Morphia – Java ODM för MongoDB