2012-12-15 20 views
10

C'è un sovraccarico nell'escludere quasi tutti i dati in un documento quando si esegue una query su un database mongo?Quanto sono efficienti le proiezioni di MongoDB?

Per esempio, nel caso in cui voglio solo field1 e field2, per una collezione con una struttura del documento di:

{ 
    "field1" : 1 
    "field2" : true 
    "field3" : ["big","array",...] 
    "field4" : ["another","big","array",...] 
} 

dovrei trarre maggior beneficio dal:

  1. Creazione di una raccolta separata insieme a questa raccolta contenente solo campo1 e campo2 oppure
  2. Uso di .f ind() sui documenti originali con inclusione/esclusione Parametri

Nota: L'inefficienza di salvare gli stessi dati due volte, non è un problema per me tanto quanto l'efficienza delle query dei dati di

Molte grazie !

+0

quanto sono grandi questi documenti? –

+0

@AsyaKamsky Circa 0,3 MB ciascuno, e campo1 e campo2 combinati <1kB. La dimensione del documento avrebbe un effetto? – Ash

+0

fa la differenza in quanta RAM i documenti occupano da quando quando si interroga un documento l'intero documento può finire nella RAM anche se si desidera solo alcuni campi specifici. I due campi sono sempre i primi due campi? –

risposta

5

La proiezione è in qualche modo simile all'uso dei nomi di colonna esplicitamente in SQL, quindi sembra un po 'contro-intuitivo chiedere se restituire una quantità minore di dati potrebbe comportare un sovraccarico per il ritorno di una maggiore quantità di dati (documento completo).

Quindi devi trovare il documento (a seconda di come .find() potrebbe essere veloce o lento) ma restituire solo i primi due campi del documento anziché tutti i campi (documento completo) lo renderebbe più veloce non più lento.

Avere una seconda raccolta può essere di beneficio solo se si è preoccupati che la collezione si inserisca nella RAM. Se i documenti nella raccolta duplicata sono molto più piccoli, possono presumibilmente adattarsi a una quantità minore di RAM totale, diminuendo la possibilità che una pagina debba essere scambiata dal disco. Tuttavia, se stai scrivendo su questa raccolta così come sulla raccolta originale, devi avere molti più dati nella RAM che se hai solo la collezione originale.

Così, mentre i dettagli complicati possono dipendere dal tuo set-up individuale, la risposta generale sarebbe probabilmente 2. Otterrai più beneficio dall'uso della proiezione e restituirai solo i due campi di cui hai bisogno.

+0

Grazie per una risposta molto dettagliata! Un'ulteriore domanda, se indicizzo su field1 e field2 e interrogando per un sottoinsieme della collezione su questi 2 campi, caricherà solo quel sottoinsieme di dati nella RAM? Mi scuso per la mia mancanza di conoscenza sui database. – Ash

+1

solo le pagine che contengono i documenti necessari saranno caricate nella RAM. Ovviamente l'indice sarà anche nella RAM. –

Problemi correlati