MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

stratégie d'index mongodb pour la requête de plage avec différents champs

Ajoutez un peu plus à baloo la réponse.

Sur l'horodatage vs long problème. Généralement, le serveur MongoDB ne verra pas de différence. La longueur d'encodage BSON est la même (64 bits). Vous pouvez voir une performance différente du côté client en fonction de l'encodage du pilote. Par exemple, du côté Java, en utilisant le pilote 10gen, un horodatage est rendu sous la forme Date c'est beaucoup plus lourd que Long . Il existe des pilotes qui essaient d'éviter cette surcharge.

L'autre problème est que vous constaterez une amélioration des performances si vous fermez la plage du premier champ de l'index. Donc si vous utilisez l'index proposé par baloo :

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

Votre requête sera (potentiellement) plus performante si votre requête est :

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

Conceptuellement, si vous considérez les index comme un arbre, la plage fermée limite les deux côtés de l'arbre au lieu d'un seul côté. Sans la plage fermée, le serveur doit "vérifier" toutes les entrées avec un start supérieur à l'horodatage fourni puisqu'il ne connaît pas la relation entre start et final .

Vous pouvez même constater que les performances de la requête ne sont pas meilleures en utilisant un seul index de champ comme :

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

La plupart des économies proviennent de la taille du premier champ. Le cas où ce ne sera pas le cas est lorsque la requête est couverte par l'index ou que le classement/tri des résultats peut être dérivé de l'index.

HTH - Rob.