Esistono due caratteristiche rilevanti di un indice che consentono ricerche rapide (rispetto all'esecuzione di una scansione della raccolta):
- Ordine dei valori
- Compattezza dei valori indicizzati
Se hai valori a
e b
, puoi dire che a
viene prima di b
, lessicograficamente. Se hai documenti {a: 2, b: 5}
e {b: 4, a: 3}
, non esiste un unico ordinamento di questi documenti che soddisfi le richieste tipiche. Ad esempio, se vuoi tutto il a
valori ordinati allora potresti aspettarti 2, 3
, ma se vuoi il b
valori che potresti aspettarti 4, 5
- richiedere l'annullamento dell'ordine dei documenti.
Quando un database archivia l'indice su disco, i valori vengono archiviati in ordine indice (qualunque cosa possa essere per l'indice particolare, ad esempio le regole di confronto influiscono su questo). In genere non esiste un unico ordinamento utilizzabile per i documenti di riscossione in generale, quindi i documenti di riscossione non sono ordinati.
Quando esegui una query per indice, prendi il valore cercato ed essenzialmente esegui una ricerca binaria utilizzando l'indice perché i dati nell'indice sono ordinati.
Il secondo motivo per utilizzare l'indice è che, se si esegue la scansione della raccolta, per ogni documento, l'intero documento in genere deve essere recuperato dal disco e saltato. Se disponi di una raccolta di 100 GB e stai eseguendo una scansione, potresti dover saltare oltre 100 GB di dati. Se la stessa raccolta ha un indice di 100 MB su un campo (perché l'indice memorizza solo i valori in quel campo e non i dati dell'intero documento) e il database esegue una scansione dell'indice completa, deve attraversare solo 100 MB di dati.
Ora, alla tua domanda sulla memorizzazione di mancanza di valori in un indice.
Dal punto di vista dell'indice, la "mancanza di valore" in documenti diversi è lo stesso valore. Perdi la capacità di eseguire ricerche binarie quando tutti i tuoi valori sono identici. Quindi, se stai cercando quel documento "mancanza di valore", l'indice ti restituirà tutti i documenti della raccolta che mancano di valore, e quindi devi comunque scansionarli per filtrare in base a qualsiasi altra condizione tu avere. Poiché questo generalmente produce una cattiva selettività, i database non si preoccupano degli indici e in primo luogo eseguono scansioni di raccolte.
E molto probabilmente vuoi altri campi fuori dalla tua query, non il campo che non ha un valore. Quindi ora vuoi che l'indice memorizzi documenti completi, vanificando l'idea di compattezza.