MongoDB Academy · Lektion

Oprettelse af enkeltfelts- og sammensatte indeks

De lærende vil oprette enkeltfelts- og sammensatte indeks og observere ændringer i forespørgselsplanen med explain('executionStats').

Lektion 2 af 413 trin

Oprettelse af enkeltfelts- og sammensatte indeks er en gratis MongoDB Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i MongoDB Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. MongoDB Academy-kurset indeholder 4 lektioner i alt.

Grundlæggende om indekser på ét felt

Et indeks på ét felt er den enkleste indekstype: det holder styr på værdierne i præcis ét dokumentfelt i et sorteret B-træ. Du opretter et med db.collection.createIndex({ field: 1 }), hvor 1 betyder stigende rækkefølge, og -1 betyder faldende. Indekser på ét felt er ideelle til forespørgsler, der filtrerer eller sorterer på ét enkelt felt.

// Create a single-field ascending index on 'email'
db.users.createIndex({ email: 1 });

// This query now hits the index instead of scanning every document
db.users.find({ email: 'alice@example.com' });

Navngivning af dine indekser

MongoDB genererer automatisk et indeksnavn som email_1 eller age_-1 ud fra feltnavnet og retningen. Du kan tilsidesætte dette med indstillingen name for at give dine indekser meningsfulde navne—det er især nyttigt, når du administrerer mange indekser i produktionen, eller når det automatisk genererede navn ville overskride grænsen på 127 tegn, der gælder for sammensatte indekser med mange felter.

db.users.createIndex(
  { email: 1 },
  { name: 'idx_users_email' }
);

// List all indexes with their names
db.users.getIndexes();

Hvad er et sammensat indeks?

Et sammensat indeks holder styr på flere felter samlet i ét B-træ. Indgangene sorteres først efter det første felt, derefter efter det andet felt inden for hver gruppe af det første felt og så videre. Det gør sammensatte indekser langt mere selektive og alsidige end flere indekser på ét felt for forespørgsler, der filtrerer eller sorterer på flere felter på én gang.

// Compound index on lastName (asc) then firstName (asc)
db.users.createIndex({ lastName: 1, firstName: 1 });

// This single index satisfies all three queries efficiently:
db.users.find({ lastName: 'Smith' });
db.users.find({ lastName: 'Smith', firstName: 'John' });
db.users.find({}).sort({ lastName: 1, firstName: 1 });

Præfiksreglen for sammensatte indekser

Et sammensat indeks på { a, b, c } kan bruges til forespørgsler på { a }, { a, b } og { a, b, c }—disse kaldes indekspræfikser. Det kan ikke bruges til en forespørgsel, der kun omfatter { b } eller { c }, fordi B-træet først er sorteret efter det første felt. Når du forstår præfiksreglen, kan du undgå at oprette overflødige indekser på ét felt, når et sammensat indeks allerede dækker dem.

db.orders.createIndex({ userId: 1, status: 1, createdAt: -1 });

// Supported by the compound index (prefixes):
db.orders.find({ userId: 'u1' });
db.orders.find({ userId: 'u1', status: 'pending' });
db.orders.find({ userId: 'u1', status: 'pending' }).sort({ createdAt: -1 });

// NOT supported - skips the first key
db.orders.find({ status: 'pending' }); // still does COLLSCAN

Oprettelse af et sammensat indeks

Du opretter et sammensat indeks ved at sende et objekt med flere felter til createIndex. Feltrækkefølgen er vigtig: placér lighedsfelter først (felter, der filtreres med $eq eller nøjagtige værdier), derefter intervalfelter og til sidst sorteringsfelter. Denne rækkefølge sikrer, at indekset bruges til både filtrering og sortering i én gennemgang efter ESR-princippet (Equality, Sort, Range).

// Orders queried by userId (equality), sorted by date (sort),
// then filtered by amount (range)
// ESR order: userId -> createdAt -> amount
db.orders.createIndex({ userId: 1, createdAt: -1, amount: 1 });

// Perfectly served by this index:
db.orders
  .find({ userId: 'u123', amount: { $gt: 100 } })
  .sort({ createdAt: -1 });

Brug af explain() til at se indeksbrug

Kontrollér altid, at dit nye indeks faktisk bruges, med .explain('executionStats'). Se efter winningPlan.stage: 'IXSCAN' for at bekræfte brugen af indekset, og sammenlign totalDocsExamined med nReturned—en velforsynet forespørgsel bør undersøge omtrent det samme antal dokumenter, som den returnerer.

const result = db.orders.find(
  { userId: 'u123' }
).explain('executionStats');

// Key fields to check:
// result.executionStats.executionStages.stage === 'IXSCAN'
// result.executionStats.totalDocsExamined
// result.executionStats.nReturned

Indeksopbygning i baggrunden

I MongoDB 4.2+ er alle indeksopbygninger som standard ikke-blokerende: De holder kun en eksklusiv lås kortvarigt i begyndelsen og slutningen af opbygningen, så læsninger og skrivninger kan fortsætte under den langvarige opbygningsfase. I ældre versioner skulle du angive { background: true } eksplicit. Opbygning af et stort indeks kan stadig bruge betydelige CPU- og I/O-ressourcer, så planlæg opbygninger i perioder med lav trafik i produktion.

// MongoDB 4.2+: non-blocking by default
db.bigCollection.createIndex({ category: 1 });

// Check ongoing index builds
db.currentOp({ 'command.createIndexes': { $exists: true } });

Sletning af indeks

Du kan fjerne et indeks med db.collection.dropIndex() ved enten at angive indeksnavnet eller nøglespecifikationen. Sletning af ubrugte indeks reducerer skriveoverhead og frigiver hukommelse. Indekset _id kan ikke slettes. Brug dropIndexes() (i flertal) til at slette alle andre indeks end _id på én gang – det er nyttigt, når du opbygger en indeksstrategi fra bunden.

// Drop by name
db.users.dropIndex('idx_users_email');

// Drop by key pattern
db.users.dropIndex({ email: 1 });

// Drop all except _id
db.users.dropIndexes();

// List remaining indexes
db.users.getIndexes();

Indeksstatistik med $indexStats

$indexStats er et aggregeringstrin, der viser hvor mange gange hvert indeks er blevet brugt, siden mongod-processen sidst blev startet. Et indeks med nul adgange er en oplagt kandidat til sletning. Kombiner disse data med indeksstørrelsen fra db.collection.stats() for at danne et komplet billede af omkostninger og fordele for hvert indeks i din samling.

db.orders.aggregate([
  { $indexStats: {} },
  { $project: {
    name: 1,
    'accesses.ops': 1,
    'accesses.since': 1
  }}
]);

Sammensatte kontra flere enkeltindeks

Flere enkeltfeltsindeks kan nogle gange kombineres via indekssnit, men MongoDBs planlægger foretrækker sammensatte indeks, når de findes. Ét veldesignet sammensat indeks er næsten altid hurtigere og mere forudsigeligt end at stole på, at planlæggeren kombinerer to separate indeks. Opret sammensatte indeks til dine hyppigste forespørgsler med flere felter i stedet for at håbe på, at indekssnit kan hjælpe dig.

// Less ideal: two separate indexes
db.products.createIndex({ category: 1 });
db.products.createIndex({ price: 1 });

// Better: one compound index for the common query pattern
db.products.createIndex({ category: 1, price: 1 });

Grænsen på 64 indeks pr. samling

MongoDB tillader højst 64 indeks pr. samling. Det er mere end rigeligt til veldesignede skemaer, men hvis du nærmer dig denne grænse, er det et stærkt tegn på, at noget er galt – måske har du mange overflødige indeks eller et tabelagtigt design, der ikke passer til dokumentmodellen. Gennemgå regelmæssigt din brug af indeks, og fjern indeks, der har nul adgange i $indexStats.

// See how many indexes your collection has
const indexes = db.myCollection.getIndexes();
console.log('Index count:', indexes.length);

// Hard limit: 64 indexes per collection
// Approaching it? Audit with $indexStats first

Hurtigt tjek

Test din forståelse af enkeltfeltsindeks og sammensatte indeks i MongoDB.

Opsummering af lektionen

I denne lektion har du lært, at enkeltfeltsindeks følger ét felt i et sorteret B-træ og understøtter forespørgsler efter lighed, område og sortering, at sammensatte indeks følger flere felter og skal forespørges ved hjælp af deres præfikser, samt at ESR-rækkefølgen (Equality, Sort, Range) maksimerer effektiviteten af sammensatte indeks. Dernæst undersøger vi særlige egenskaber ved indeks, f.eks. unique, sparse, partial og TTL.

Gratis at komme i gang

Lær JavaScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “Oprettelse af enkeltfelts- og sammensatte indeks” gratis?

Ja — hele teksten til “Oprettelse af enkeltfelts- og sammensatte indeks” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af MongoDB Academy-kurset, skal du opgradere til CoddyKit PRO. MongoDB Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Oprettelse af enkeltfelts- og sammensatte indeks”?

De lærende vil oprette enkeltfelts- og sammensatte indeks og observere ændringer i forespørgselsplanen med explain('executionStats'). Du øver dig i MongoDB Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på MongoDB Academy?

Der kræves ingen tidligere erfaring. MongoDB Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Oprettelse af enkeltfelts- og sammensatte indeks”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne MongoDB Academy-lektion?

Ja. Alle MongoDB Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Sådan fungerer MongoDB-B-træ-indeks
  2. Oprettelse af enkeltfelts- og sammensatte indeks
  3. Indeksegenskaber: unique, sparse, partial og TTL
  4. Læsning af explain()-output til diagnosticering af forespørgsler
← Tilbage til MongoDB Academy