MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

L'indice MongoDB/Mongoose rende la query più veloce o la rallenta?

Stai leggendo male

Stai interpretando erroneamente l'intento del blocco citato in merito a ciò che .ensureIndex() (ora deprecato, ma ancora chiamato dal codice mongoose) lo fa effettivamente qui nel contesto.

In mongoose, definisci un indice a livello di schema o di modello in base al tuo progetto. Ciò che la mangusta "automaticamente" fa per te è che durante la connessione ispeziona ogni modello registrato e quindi chiama l'appropriato .ensureIndex() metodi per le definizioni degli indici fornite.

Che cosa fa effettivamente?

Bene, nella maggior parte dei casi, dopo aver già avviato l'applicazione prima e il .ensureIndexes() il metodo eseguito è Assolutamente Niente . È un po' esagerato, ma suona più o meno vero.

Poiché la definizione dell'indice è già stata creata nella raccolta di server, una chiamata successiva non esegue alcuna operazione. Cioè, non rilascia l'indice e "ricrea". Quindi il costo reale è praticamente nulla, una volta creato l'indice stesso.

Creazione di indici

Quindi, poiché mongoose è solo un livello sopra l'API standard, createIndex() contiene tutti i dettagli di ciò che sta accadendo.

Ci sono alcuni dettagli da considerare qui, come il fatto che una build dell'indice può avvenire in "background" e, sebbene questo sia meno invadente per la tua applicazione, viene a sue spese. In particolare, la dimensione dell'indice dalla generazione "in background" sarà maggiore rispetto a se lo avessi creato in primo piano, bloccando altre operazioni.

Inoltre, tutti gli indici hanno un costo, in particolare in termini di utilizzo del disco e un costo aggiuntivo per la scrittura delle informazioni aggiuntive al di fuori dei dati di raccolta stessi.

I vantaggi di un indice sono che è molto più veloce "cercare" i valori contenuti all'interno di un indice piuttosto che cercare nell'intera raccolta e far corrispondere le possibili condizioni.

Questi sono i "compromessi" di base associati agli indici.

Modello di implementazione

Torna al blocco citato dalla documentazione, c'è un vero intento dietro questo consiglio.

È tipico nei modelli di distribuzione e in particolare con le migrazioni dei dati eseguire le operazioni in questo ordine:

  1. Popolare i dati in raccolte/tabelle pertinenti
  2. Abilita indici sui dati di raccolta/tabella pertinenti alle tue esigenze

Questo perché la creazione dell'indice comporta un costo e, come accennato in precedenza, è desiderabile ottenere la dimensione ottimale dalla build dell'indice, oltre a evitare che ogni inserimento di documenti abbia anche il sovraccarico di scrivere una voce di indice quando si è eseguendo questo "caricamento" in blocco.

Ecco a cosa servono gli indici, quelli sono i costi ei benefici e viene spiegato il messaggio nella documentazione della mangusta.

In generale, tuttavia, suggerisco di leggere gli Indici di database per quello che sono e per quello che fanno. Pensa di entrare in una biblioteca per trovare un libro. C'è un indice delle carte lì all'ingresso. Giri per la biblioteca per trovare il libro che desideri? O lo cerchi nell'indice delle carte per trovare dove si trova? Quell'indice ha richiesto del tempo a qualcuno per crearlo e anche mantenerlo aggiornato, ma ti fa risparmiare il tempo di girare per l'intera biblioteca solo così puoi trovare il tuo libro.