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

Comprensione degli indici MongoDB

Tra i compiti coinvolti nella gestione del database c'è il miglioramento delle prestazioni utilizzando diverse strategie. L'indicizzazione è uno dei suggerimenti che migliorano le operazioni di throughput facilitando l'accesso ai dati alle richieste di query. Lo fa riducendo al minimo il numero di accessi al disco richiesti quando viene elaborata una query. Il mancato utilizzo degli indici in MongoDB costringerà il database a eseguire una scansione completa della raccolta, ovvero eseguire la scansione di tutti i documenti nella raccolta per selezionare i documenti che corrispondono a un'istruzione di query emessa. Ovviamente, questo richiederà molto tempo soprattutto se ci sono così tanti documenti coinvolti. In poche parole, gli indici supportano l'esecuzione efficiente delle query.

Indici MongoDB

Poiché ci aspettiamo di archiviare molti documenti in una raccolta MongoDB, dobbiamo trovare un modo per archiviare una piccola porzione di dati per ciascun documento in una partizione diversa per un facile attraversamento mediante l'uso degli indici. Un indice memorizzerà uno o più campi specifici di campo e quindi ordinerà questi dati in base al valore di quel campo. Con questo ordinamento, sono supportate la corrispondenza efficiente delle query e le operazioni di query basate sull'intervallo. Gli indici sono definiti a livello di raccolta e sono supportati da qualsiasi campo o campo incorporato dei documenti nella raccolta.

Quando crei un documento, MongoDB per impostazione predefinita assegna un campo _id se non specificato e lo rende un indice univoco per quel documento. Fondamentalmente, questo per evitare di inserire nello stesso documento più di quelli in quella raccolta. Inoltre, per un cluster sharded, è consigliabile utilizzare questo campo _id come parte della selezione delle chiavi shard, altrimenti deve esserci una certa unicità dei dati nel campo _id per evitare errori.

Creazione di un indice per una raccolta

Supponendo che tu abbia inserito alcuni dati nella tua raccolta e desideri assegnare un campo come indice, puoi utilizzare il metodo createIndex per ottenere ciò, ad es.

Supponiamo che tu abbia questi dati json:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Possiamo rendere il campo Nome un indice discendente per:

db.collection.createIndex({Name: -1})

Questo metodo crea un indice con la stessa specifica se solo non esiste già.

Tipi di indici in MongoDB

MongoDB coinvolge diversi tipi di dati, quindi vengono derivati ​​diversi tipi di indici per supportare questi tipi di dati e query.

  1. Campo singolo

    Utilizzando un singolo campo di un documento è possibile rendere il campo un indice in modo ascendente o discendente proprio come nell'esempio sopra. Inoltre, puoi creare un indice su un documento incorporato nel suo insieme, ad esempio:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Il campo del contatto è un documento incorporato, quindi possiamo renderlo un indice crescente con il comando:

    db.collection.createIndex({ Contact: 1})

    In una query possiamo recuperare il documento come:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Una procedura consigliata è la creazione dell'indice in background, soprattutto quando è coinvolta una grande quantità di dati poiché l'applicazione deve accedere ai dati durante la creazione dell'indice.

  2. Indice composto

    Gli indici composti vengono spesso usati per facilitare l'operazione di ordinamento all'interno di una query e supportare le query che corrispondono a più campi. La sintassi per creare un indice composto è:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Creazione di un indice composto per i dati di esempio di seguito

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Considerazioni:

    • Può essere supportato un limite di soli 32 campi.
    • Il valore del campo definirà il tipo di indice, ovvero 1 è crescente e -1 è decrescente.
    • Non creare indici composti con tipo di indice hash.
    • L'ordine dei campi elencati in un indice composto è importante. Lo smistamento avverrà secondo l'ordine dei campi.
  3. Indice multichiave

    Ad un certo punto, potresti avere campi con contenuto di array archiviato. Quando questi campi vengono indicizzati, vengono create voci di indice separate per ogni elemento. Aiuta quindi una query a selezionare i documenti che consistono in matrici facendo corrispondere l'elemento o gli elementi delle matrici. Questo viene fatto automaticamente da MongoDB, quindi non è necessario specificare esplicitamente il tipo multichiave. Dalla versione 3.4, MongoDB tiene traccia di quali campi indicizzati fanno sì che un indice sia un indice multichiave. Con questo monitoraggio, il motore di query del database può utilizzare limiti di indice più stretti.

    Limitazioni dell'indice multichiave

    • Un solo campo array può essere utilizzato nell'indicizzazione multichiave per un documento nella raccolta. Cioè. Non puoi creare un indice multichiave per il comando e i dati sotto
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Non puoi creare un indice multichiave
      { nums: 1, scores: 1 } 
    • Se l'indice multichiave esiste già, non è possibile inserire un documento che viola questa restrizione. Questo per dire se abbiamo
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Dopo aver creato un indice multichiave composto, un tentativo di inserire un documento in cui entrambi i campi numeri e punteggi sono matrici, il database fallirà l'inserimento.
  4. Indici di testo

    Gli indici di testo vengono spesso utilizzati per migliorare le query di ricerca per una stringa in una raccolta. Non memorizzano parole chiave specifiche per la lingua (cioè "il", "a", "o"). Una raccolta può avere al massimo un indice di testo. Per creare un indice di testo:

    db.collection.createIndex({Name:”text”})

    Puoi anche indicizzare più campi, ad es.

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Un indice composto può includere una chiave di indice di testo in combinazione con la chiave di indice crescente/decrescente ma:

    • Tutte le chiavi dell'indice di testo devono essere adiacenti nel documento di specifica dell'indice durante la creazione di un indice di testo composto.
    • Nessun altro tipo di indice speciale come i campi di indice multichiave dovrebbe essere coinvolto nell'indice di testo composto.
    • Per eseguire una ricerca $testo, il predicato della query deve includere condizioni di corrispondenza di uguaglianza sulle chiavi precedenti.
  5. Indici con hash

    Lo sharding è una delle tecniche utilizzate in MongoDB per migliorare il ridimensionamento orizzontale. Lo sharding spesso implica un concetto basato su hash mediante l'uso di indici hash. La distribuzione più casuale dei valori lungo il loro intervallo è rappresentata da questi indici, ma supportano solo le corrispondenze di uguaglianza e non possono supportare le query basate sull'intervallo.

Considerazioni operative generali per gli indici

  • Ogni indice richiede almeno 8kB di spazio dati.
  • Quando è attivo, ogni indice consumerà spazio su disco e memoria. Questo è significativo se monitorato nella pianificazione della capacità.
  • Per una raccolta con un rapporto lettura-scrittura elevato, indici aggiuntivi migliorano le prestazioni e non influiscono sulle operazioni di lettura non indicizzate.

Limitazioni all'utilizzo degli indici

  • L'aggiunta di un indice ha un impatto negativo sulle prestazioni per le operazioni di scrittura, in particolare per le raccolte con un elevato rapporto scrittura/lettura. Gli indici saranno costosi in quanto ogni inserto deve anche aggiornare qualsiasi indice.
  • MongoDB non creerà, aggiornerà un indice o non inserirà in una raccolta indicizzata se la voce dell'indice per un documento esistente supera il limite della chiave dell'indice.
  • Per le raccolte partizionate esistenti, la migrazione del blocco avrà esito negativo se il blocco ha un documento che contiene un campo indicizzato con una voce dell'indice che supera il limite della chiave dell'indice.

Conclusione

Ci sono tanti modi per migliorare le prestazioni di MongoDB, l'indicizzazione è uno di questi. L'indicizzazione facilita le operazioni di query riducendo la latenza su cui i dati vengono recuperati riducendo in qualche modo il numero di documenti che devono essere scansionati. Tuttavia, ci sono alcune considerazioni da fare prima di decidere di utilizzare un tipo specifico di indice. Le raccolte con un elevato rapporto lettura-scrittura tendono a utilizzare gli indici meglio delle raccolte con operazioni di scrittura-lettura elevate.