Hantera indexering i Azure Azure Azure Dbs API för MongoDB

GÄLLER FÖR: Azure Azure Azures DB API för MongoDB

Azure Azure Azure Dbs API för MongoDB drar nytta av de grundläggande indexhanteringsfunktionerna i Azure Azures DB. Den här artikeln handlar om hur du lägger till index med hjälp av Azure Azure Azure Dbs API för MongoDB. Index är specialiserade datastrukturer som gör det snabbare att fråga efter data i en storleksordning.

Indexering för MongoDB server version 3.6 och senare

Azure Azure DB-API för MongoDB server version 3.6+ indexerar automatiskt fältet och den fragmenterade nyckeln (endast i _id fragmenterade samlingar). API:t tillämpar automatiskt unikheten för _id fältet per fragmentnyckel.

API:t för MongoDB fungerar annorlunda än Azure Azure Azures DB SQL API, som indexerar alla fält som standard.

Redigera indexeringsprincip

Vi rekommenderar att du redigerar indexeringsprincipen i Data Explorer i Azure Portal. . Du kan lägga till index för enstaka fält och jokertecken från indexeringsprincipredigeraren i Datautforskaren:

Redigeraren för indexeringsprincip

Obs!

Du kan inte skapa sammansatta index med hjälp av indexeringsprincipredigeraren i Datautforskaren.

Indextyper

Ett fält

Du kan skapa index för alla enskilda fält. Sorteringsordningen för det enskilda fältindexet spelar ingen roll. Följande kommando skapar ett index för name fältet:

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

Du kan skapa samma fältindex på name i Azure Portal:

Lägga till namnindex i redigeraren för indexeringsprincip

En fråga använder flera fältindex där så är tillgängligt. Du kan skapa upp till 500 enskilda fältindex per samling.

Sammansatta index (MongoDB server version 3.6+)

I API för MongoDB krävs sammansatta index om frågan behöver kunna sortera på flera fält samtidigt. Skapa flera fältindex istället för ett sammansatt index för att spara på indexeringskostnader för frågor med flera filter som inte behöver sorteras.

Ett sammansatt index eller ett enda fältindex för varje fält i det sammansatta indexet ger samma prestanda för filtrering i frågor.

Obs!

Du kan inte skapa sammansatta index för kapslade egenskaper eller matriser.

Följande kommando skapar ett sammansatt index för fälten nameage och:

db.coll.createIndex({name:1,age:1})

Du kan använda sammansatta index för att sortera effektivt på flera fält samtidigt, enligt följande exempel:

db.coll.find().sort({name:1,age:1})

Du kan också använda föregående sammansatta index för att effektivt sortera på en fråga med motsatt sorteringsordning för alla fält. Här är ett exempel:

db.coll.find().sort({name:-1,age:-1})

Men sekvensen av sökvägar i det sammansatta indexet måste exakt matcha frågan. Här är ett exempel på en fråga som skulle kräva ytterligare ett sammansatt index:

db.coll.find().sort({age:1,name:1})

Obs!

Sammansatta index används endast i frågor som sorterar resultat. För frågor som har flera filter som inte behöver sorteras skapar du flera fältindex.

Flernyckelindex

Azure Azure Azures DB skapar flernyckelindex för indexinnehåll som lagras i matriser. Om du indexerar ett fält med ett matrisvärde indexerar Azure Azure Db automatiskt alla element i matrisen.

Geospatiala index

Många geospatiala operatorer kan dra nytta av geospatiala index. För närvarande har Azure Azure Azure Azure DB:s API för MongoDB 2dsphere stöd för index. API:t har ännu inte stöd 2d för index.

Här är ett exempel på hur du skapar ett geospatialt index för location fältet:

db.coll.createIndex({ location : "2dsphere" })

Textindex

Azure Azure Azure DB:s API för MongoDB stöder för närvarande inte textindex. För textsökningsfrågor om strängar bör du använda Azure-kognitiv sökningsintegrering med Azure Azure Azures DB.

Jokerteckenindex

Du kan använda jokerteckenindex för att stödja frågor mot okända fält. Anta att du har en samling som innehåller information om familjer.

Här är en del av ett exempeldokument i den samlingen:

"children": [
   {
     "firstName": "Henriette Thaulow",
     "grade": "5"
   }
]

Här är ett annat exempel, den här gången med en något annorlunda uppsättning egenskaper children i:

"children": [
    {
     "familyName": "Merriam",
     "givenName": "Jesse",
     "pets": [
         { "givenName": "Goofy" },
         { "givenName": "Shadow" }
         ]
   },
   {
     "familyName": "Merriam",
     "givenName": "John",
   }
]

I den här samlingen kan dokument ha många olika möjliga egenskaper. Om du vill indexera alla data i matrisen har du två alternativ: skapa separata index för varje enskild egenskap eller skapa ett children jokerteckenindex för hela children matrisen.

Skapa ett jokerteckenindex

Följande kommando skapar ett jokerteckenindex för alla egenskaper children i:

db.coll.createIndex({"children.$**" : 1})

Till skillnad från MongoDB kan jokerteckenindex ha stöd för flera fält i fråge predikat. Frågeprestandan påverkas inte om du använder ett enda jokerteckenindex i stället för att skapa ett separat index för varje egenskap.

Du kan skapa följande indextyper med hjälp av syntaxen för jokertecken:

  • Ett fält
  • Geospatial

Indexera alla egenskaper

Så här kan du skapa ett jokerteckenindex för alla fält:

db.coll.createIndex( { "$**" : 1 } )

Du kan också skapa jokerteckenindex med hjälp av Datautforskaren i Azure-portalen:

Lägga till index för jokertecken i redigeraren för indexeringsprincip

Obs!

Om du bara håller på att utveckla rekommenderar vi att du börjar med ett jokerteckenindex för alla fält. Det kan förenkla utvecklingen och göra det enklare att optimera frågor.

Dokument med många fält kan ha en hög begäranhetsenhet (RU) att ta betalt för skriver och uppdateringar. Om du har en hög skrivbelastning bör du därför välja enskilda indexsökvägar i motsats till att använda jokerteckenindex.

Begränsningar

Jokerteckenindex stöder inte någon av följande indextyper eller egenskaper:

  • Sammansatt
  • TTL
  • Unik

Till skillnad från MongoDBkan du inte använda jokerteckenindex för:

  • Skapa ett jokerteckenindex som innehåller flera specifika fält

    db.coll.createIndex(
        { "$**" : 1 },
        { "wildcardProjection " :
            {
               "children.givenName" : 1,
               "children.grade" : 1
            }
        }
    )
    
  • Skapa ett jokerteckenindex som utesluter flera specifika fält

    db.coll.createIndex(
        { "$**" : 1 },
        { "wildcardProjection" :
            {
               "children.givenName" : 0,
               "children.grade" : 0
            }
        }
    )
    

Alternativt kan du skapa flera jokerteckenindex.

Indexegenskaper

Följande åtgärder är vanliga för konton som använder wire protocol version 4.0 och konton som fungerar i tidigare versioner. Du kan läsa mer om index som stöds och indexerade egenskaper.

Unika index

Unika index är användbara för att framtvinga att två eller flera dokument inte innehåller samma värde för indexerade fält.

Viktigt

Unika index kan bara skapas när samlingen är tom (inte innehåller några dokument).

Följande kommando skapar ett unikt index för student_id fältet:

globaldb:PRIMARY> db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
    "_t" : "CreateIndexesResponse",
    "ok" : 1,
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 4
}

För fragmenterade samlingar måste du ange nyckeln shard (partition) för att skapa ett unikt index. Med andra ord är alla unika index på en fragmenterad samling sammansatta index där ett av fälten är partitionsnyckeln.

Följande kommandon skapar en fragmenterad samling coll (den fragmenterade nyckeln är university ) med ett unikt index för fälten student_iduniversity och:

globaldb:PRIMARY> db.runCommand({shardCollection: db.coll._fullName, key: { university: "hashed"}});
{
    "_t" : "ShardCollectionResponse",
    "ok" : 1,
    "collectionsharded" : "test.coll"
}
globaldb:PRIMARY> db.coll.createIndex( { "university" : 1, "student_id" : 1 }, {unique:true});
{
    "_t" : "CreateIndexesResponse",
    "ok" : 1,
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 3,
    "numIndexesAfter" : 4
}

I exemplet ovan returnerar utelämnande av "university":1 satsen ett fel med följande meddelande:

kan inte skapa unikt index över {student_id : 1,0} med fragmentnyckelmönster { university : 1,0 }

TTL-index

Om du vill aktivera förfallotid för dokument i en viss samling måste du skapa ett TTL-index (Time To Live). Ett TTL-index är ett index för _ts fältet med ett expireAfterSeconds värde.

Exempel:

globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})

Med föregående kommando tas alla dokument i samlingen som inte db.coll har ändrats de senaste 10 sekunderna bort.

Obs!

Fältet _ts är specifikt för Azure Azure DB och kan inte kommas åt från MongoDB-klienter. Det är en reserverad egenskap (system) som innehåller tidsstämpeln för dokumentets senaste ändring.

Spåra indexstatus

Version 3.6+ av Azure Hansson DB:s API för MongoDB stöder kommandot för att spåra currentOp() indexstatus för en databasinstans. Det här kommandot returnerar ett dokument som innehåller information om pågående åtgärder i en databasinstans. Du använder kommandot currentOp för att spåra alla pågående åtgärder i inbyggda MongoDB. I Azure Azure AzureS DB-API för MongoDB har det här kommandot bara stöd för spårning av indexåtgärden.

Här är några exempel som visar hur du använder kommandot currentOp för att spåra indexstatus:

  • Hämta indexstatus för en samling:

    db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})
    
  • Hämta indexstatus för alla samlingar i en databas:

    db.currentOp({"command.$db": <databaseName>})
    
  • Få indexstatus för alla databaser och samlingar i ett Azure Azure Azure-konto:

    db.currentOp({"command.createIndexes": { $exists : true } })
    

Exempel på indexstatusresultat

I informationen för indexens förlopp visas förloppsprocenten för den aktuella indexåtgärden. Här är ett exempel som visar formatet för utdatadokumentet för olika steg i indexförloppet:

  • Indexåtgärden för en "foo"-samling och "bar"-databas som är 60 procent färdig har följande utdatadokument. I Inprog[0].progress.total fältet visas 100 som procent för slutförandemålet.

    {
          "inprog" : [
          {
                  ………………...
                  "command" : {
                          "createIndexes" : foo
                          "indexes" :[ ],
                          "$db" : bar
                  },
                  "msg" : "Index Build (background) Index Build (background): 60 %",
                  "progress" : {
                          "done" : 60,
                          "total" : 100
                  },
                  …………..…..
          }
          ],
          "ok" : 1
    }
    
  • Om en indexåtgärd precis har startats i en "foo"-samlings- och "stapeldatabas" kan utdatadokumentet visa 0 procents förlopp tills det når en mätbar nivå.

    {
          "inprog" : [
          {
                  ………………...
                  "command" : {
                          "createIndexes" : foo
                          "indexes" :[ ],
                          "$db" : bar
                  },
                  "msg" : "Index Build (background) Index Build (background): 0 %",
                  "progress" : {
                          "done" : 0,
                          "total" : 100
                  },
                  …………..…..
          }
          ],
         "ok" : 1
    }
    
  • När den pågående indexåtgärden har avslutats visar utdatadokumentet tomma inprog åtgärder.

    {
        "inprog" : [],
        "ok" : 1
    }
    

Uppdateringar av bakgrundsindex

Oavsett vilket värde som anges för egenskapen Bakgrundsindex görs indexuppdateringar alltid i bakgrunden. Eftersom indexuppdateringar använder begärande enheter med lägre prioritet än andra databasåtgärder leder inte indexändringar till driftstopp för skriver, uppdateringar eller borttagningar.

Lästillgänglighet påverkas inte när ett nytt index läggs till. Frågor använder bara nya index när indexomvandlingen är klar. Under indexomvandlingen fortsätter frågemotorn att använda befintliga index, så du kommer att se liknande läsprestanda under indexeringstransformeringen som det du hade observerat innan du initierade indexeringsändringen. När du lägger till nya index finns det heller ingen risk för ofullständiga eller inkonsekventa frågeresultat.

När du tar bort index och omedelbart kör frågor har filtren för neds ignorerade index, kan resultatet bli inkonsekvent och ofullständigt tills indexomvandlingen har avslutats. Om du tar bort index ger frågemotorn inte konsekventa eller fullständiga resultat när frågor filtreras på dessa nyligen borttagna index. De flesta utvecklare släpper inte index och försöker sedan genast fråga dem, så det är i praktiken osannolikt.

Obs!

Du kan spåra indexstatus.

Kommandot Indexera om

Med reIndex kommandot återskapas alla index för en samling. I sällsynta fall kan frågeprestanda eller andra indexproblem i din samling lösas genom att köra reIndex kommandot. Om du upplever problem med indexering rekommenderar vi att du återskapar indexen reIndex med kommandot.

Du kan köra reIndex kommandot med följande syntax:

db.runCommand({ reIndex: <collection> })

Du kan använda syntaxen nedan för att kontrollera om när du kör reIndex kommandot skulle förbättra frågeprestandan i din samling:

db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})

Exempel:

{
        "database" : "myDB",
        "collection" : "myCollection",
        "provisionedThroughput" : 400,
        "indexes" : [
                {
                        "v" : 1,
                        "key" : {
                                "_id" : 1
                        },
                        "name" : "_id_",
                        "ns" : "myDB.myCollection",
                        "requiresReIndex" : true
                },
                {
                        "v" : 1,
                        "key" : {
                                "b.$**" : 1
                        },
                        "name" : "b.$**_1",
                        "ns" : "myDB.myCollection",
                        "requiresReIndex" : true
                }
        ],
        "ok" : 1
}

Om reIndex du vill förbättra frågeprestandan reIndex vara sant. Om reIndex frågeprestandan inte förbättras utelämnas den här egenskapen.

Migrera samlingar med index

För närvarande kan du bara skapa unika index när samlingen inte innehåller några dokument. Vanliga MongoDB-migreringsverktyg försöker skapa unika index efter att data har importerats. Om du vill kringgå det här problemet kan du manuellt skapa motsvarande samlingar och unika index i stället för att låta migreringsverktyget försöka. (Du kan uppnå detta mongorestore genom att använda flaggan i --noIndexRestore kommandoraden.)

Indexering för MongoDB version 3.2

Tillgängliga indexeringsfunktioner och standardinställningar är olika för Azure Azure Azure-konton som är kompatibla med version 3.2 av MongoDB-trådprotokollet. Du kan kontrollera kontots version och uppgradera till version 3.6.

Om du använder version 3.2 beskriver det här avsnittet viktiga skillnader med version 3.6+.

Släppa standardindex (version 3.2)

Till skillnad från 3,6+-versionerna av Azure Azure Eller Dbs API för MongoDB så indexeras varje egenskap som standard av version 3.2. Du kan använda följande kommando för att släppa standardindexen för en samling ( coll ):

> db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }

När du släppt standardindexen kan du lägga till fler index på samma sätt som i version 3.6+.

Sammansatta index (version 3.2)

Sammansatta index innehåller referenser till flera fält i ett dokument. Om du vill skapa ett sammansatt index uppgraderar du till version 3.6 eller 4.0.

Jokerteckenindex (version 3.2)

Om du vill skapa ett jokerteckenindex uppgraderar du till version 4.0 eller 3.6.

Nästa steg