2013-03-24 11 views
10

Almoust tutti i miei documenti includono 2 campi, inizio timestamp e fine timestamp. E in ogni mia domanda ho bisogno di ottenere elementi che sono in un determinato periodo di tempo. quindi start dovrebbe essere dopo il valore selezionato e la finale dovrebbe essere prima del timestamp selezionato.strategia dell'indice mongodb per query di intervallo con campi diversi

interrogazione sembra

db.collection.find({start:{$gt:DateTime(...)}, final:{$lt:DateTime(...)}}) 

Così che cosa la migliore strategia di indicizzazione per questo scenario?


Tra l'altro, che è meglio per le prestazioni - fino ad oggi negozio come datetimes o come timestamp Unix, che è lunga valore stesso

risposta

3

È possibile utilizzare un Compound index al fine di creare un indice per più campi .

db.collection.ensureIndex({start: 1, final: 1}) 

Confronta query e indici differenti utilizzando explain() per ottenere il massimo dal vostro database

+0

Sì, sono a conoscenza dell'indice di composizione. L'unica cosa che ho paura in questo caso non sarà vantaggi per la query composita su una singola query di campo. Ma non lo so per certo. Pensa ad alcuni esperimenti necessari. –

+0

Fintanto che il campo singolo è il primo campo dell'indice composito, sei pronto per partire – baloo

11

troppo aggiungere un po 'di più per s' Baloo risposta.

Sul time stamp contro il lungo problema. Generalmente il server MongoDB non vedrà una differenza. La lunghezza di codifica BSON è la stessa (64 bit). È possibile che si verifichi una prestazione diversa sul lato client a seconda della codifica del driver. Ad esempio, sul lato Java a utilizzando il driver 10gen un timestamp viene visualizzato come Date che è molto più pesante di Long. Ci sono drivers che cercano di evitare quel sovraccarico.

L'altro problema è che si vedrà un miglioramento delle prestazioni se si chiude l'intervallo per il primo campo dell'indice. Quindi, se si utilizza l'indice suggerito da Baloo:

db.collection.ensureIndex({start: 1, final: 1}) 

query È si esibiranno (potenzialmente molto) meglio se si domanda è:

db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
        final:{$lt:DateTime(...)}}) 

Concettualmente, se si pensa degli indici come aa albero la gamma chiusa limita entrambi i lati dell'albero invece di un solo lato. Senza l'intervallo chiuso, il server deve "controllare" tutte le voci con un valore start superiore al timestamp fornito poiché non conosce la relazione tra start e final.

Si può anche scoprire che che le prestazioni di query non è migliore usando un unico indice di campo, come:

db.collection.ensureIndex({start: 1}) 

La maggior parte dei risparmi è dalla potatura del primo campo. Il caso in cui ciò non avverrà è quando la query è coperta dall'indice o l'ordinamento/l'ordinamento per i risultati può essere derivato dall'indice.

HTH - Rob.

+0

Grande avviso sul limite superiore per il primo elemento.È molto naturale e potrebbe influire molto sulle prestazioni. =) Ma ancora esitando tra il campo singolo e l'indice composito. Pensa ad alcuni esperimenti necessari. –

Problemi correlati