Cos'è l'indicizzazione?
L'indicizzazione è un concetto importante nel mondo dei database. Il vantaggio principale della creazione di indici su qualsiasi campo è l'accesso più rapido ai dati. Ottimizza il processo di ricerca e accesso al database. Considera questo esempio per capirlo.
Quando un utente chiede una riga specifica dal database, cosa farà il sistema DB? Inizierà dalla prima riga e verificherà se questa è la riga che l'utente desidera? Se sì, restituisci quella riga, altrimenti continua a cercare la riga fino alla fine.
In genere, quando si definisce un indice su un campo particolare, il sistema DB creerà un elenco ordinato del valore di quel campo e lo memorizzerà in una tabella diversa. Ogni voce di questa tabella punterà ai valori corrispondenti nella tabella originale. Pertanto, quando l'utente tenta di cercare qualsiasi riga, cercherà prima il valore nella tabella dell'indice utilizzando l'algoritmo di ricerca binaria e restituirà il valore corrispondente dalla tabella originale. Questo processo richiederà meno tempo perché stiamo usando la ricerca binaria invece della ricerca lineare.
In questo articolo, ci concentreremo sull'indicizzazione di MongoDB e capiremo come creare e utilizzare gli indici in MongoDB.
Come creare un indice nella raccolta MongoDB?
Per creare un indice usando Mongo shell, puoi usare questa sintassi:
db.collection.createIndex( <key and index type specification>, <options> )
Esempio:
Per creare l'indice sul campo del nome nella raccolta myColl:
db.myColl.createIndex( { name: -1 } )
Tipi di indici MongoDB
-
Indice _id predefinito
Questo è l'indice predefinito che verrà creato da MongoDB quando crei una nuova raccolta. Se non specifichi alcun valore per questo campo, _id sarà la chiave primaria per impostazione predefinita per la tua raccolta in modo che un utente non possa inserire due documenti con gli stessi valori del campo _id. Non puoi rimuovere questo indice dal campo _id.
-
Indice a campo singolo
Puoi utilizzare questo tipo di indice quando desideri creare un nuovo indice su qualsiasi campo diverso da _id campo.
Esempio:
db.myColl.createIndex( { name: 1 } )
Questo creerà un indice ascendente a chiave singola sul campo del nome nella raccolta myColl
-
Indice composto
Puoi anche creare un indice su più campi usando gli indici composti. Per questo indice, l'ordine dei campi in cui sono definiti nell'indice è importante. Considera questo esempio:
db.myColl.createIndex({ name: 1, score: -1 })
Questo indice prima ordina la raccolta per nome in ordine ascendente e poi, per ogni valore di nome, ordina in base ai valori del punteggio in ordine decrescente.
-
Indice multichiave
Questo indice può essere utilizzato per indicizzare i dati dell'array. Se un campo in una raccolta ha un array come valore, puoi utilizzare questo indice che creerà voci di indice separate per ogni elemento nell'array. Se il campo indicizzato è un array, MongoDB creerà automaticamente l'indice Multikey su di esso.
Considera questo esempio:
{ ‘userid’: 1, ‘name’: ‘mongo’, ‘addr’: [ {zip: 12345, ...}, {zip: 34567, ...} ] }
Puoi creare un indice multichiave sul campo addr emettendo questo comando nella shell Mongo.
db.myColl.createIndex({ addr.zip: 1 })
-
Indice geospaziale
Supponiamo di aver memorizzato alcune coordinate nella raccolta MongoDB. Per creare un indice su questo tipo di campi (che ha dati geospaziali), puoi utilizzare un indice geospaziale. MongoDB supporta due tipi di indici geospaziali.
-
Indice 2D:puoi utilizzare questo indice per i dati archiviati come punti sul piano 2D.
db.collection.createIndex( { <location field> : "2d" } )
-
Indice 2dsphere:usa questo indice quando i tuoi dati sono archiviati come formato GeoJson o coppie di coordinate (longitudine, latitudine)
db.collection.createIndex( { <location field> : "2dsphere" } )
-
-
Indice di testo
Per supportare le query che includono la ricerca di testo nella raccolta, puoi utilizzare Indice di testo.
Esempio:
db.myColl.createIndex( { address: "text" } )
-
Indice con hash
MongoDB supporta lo sharding basato su hash. L'indice hash calcola l'hash dei valori del campo indicizzato. L'indice hash supporta il partizionamento orizzontale utilizzando chiavi partizionate con hash. Il partizionamento orizzontale con hash utilizza questo indice come chiave shard per partizionare i dati nel tuo cluster.
Esempio:
db.myColl.createIndex( { _id: "hashed" } )
-
Indice unico
Questa proprietà garantisce che non vi siano valori duplicati nel campo indicizzato. Se vengono trovati duplicati durante la creazione dell'indice, verranno eliminate quelle voci.
-
Indice sparso
Questa proprietà garantisce che tutte le query cerchino documenti con campo indicizzato. Se un documento non ha un campo indicizzato, verrà eliminato dal set di risultati.
-
Indice TTL
Questo indice viene utilizzato per eliminare automaticamente i documenti da una raccolta dopo un intervallo di tempo specifico (TTL). Questo è l'ideale per rimuovere documenti di registri eventi o sessioni utente.
Analisi delle prestazioni
Considera una raccolta di punteggi degli studenti. Contiene esattamente 3000000 documenti. Non abbiamo creato alcun indice in questa raccolta. Vedi questa immagine qui sotto per capire lo schema.
Documenti di esempio nella raccolta delle partitureOra, considera questa query senza indici:
db.scores.find({ student: 585534 }).explain("executionStats")
Questa query richiede 1155 ms per l'esecuzione. Ecco l'uscita. Cerca il campo esecuzioneTimeMillis per il risultato.
Tempo di esecuzione senza indicizzazioneOra creiamo l'indice sul campo studente. Per creare l'indice, esegui questa query.
db.scores.createIndex({ student: 1 })
Ora la stessa query richiede 0 ms.
Tempo di esecuzione con indicizzazionePuoi vedere chiaramente la differenza nel tempo di esecuzione. È quasi istantaneo. Questo è il potere dell'indicizzazione.
Conclusione
Una cosa ovvia è:creare indici. In base alle tue query, puoi definire diversi tipi di indici sulle tue raccolte. Se non crei indici, ogni query eseguirà la scansione delle raccolte complete, il che richiede molto tempo rendendo la tua applicazione molto lenta e utilizza molte risorse del tuo server. D'altra parte, non creare troppi indici perché la creazione di indici non necessari comporterà un sovraccarico di tempo aggiuntivo per tutti gli inserimenti, le eliminazioni e gli aggiornamenti. Quando si esegue una di queste operazioni su un campo indicizzato, è necessario eseguire la stessa operazione anche sull'albero dell'indice, operazione che richiede tempo. Gli indici sono archiviati nella RAM, quindi la creazione di indici irrilevanti può consumare spazio nella RAM e rallentare il server.