MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

estratégia de índice mongodb para consulta de intervalo com campos diferentes


Também adicione um pouco mais ao baloo a resposta de.

Na questão do carimbo de data/hora vs. longa. Geralmente, o servidor MongoDB não verá diferença. O comprimento da codificação BSON é o mesmo (64 bits). Você pode ver um desempenho diferente no lado do cliente dependendo da codificação do driver. Como exemplo, no lado Java, usando o driver 10gen, um carimbo de data/hora é renderizado como Date que é muito mais pesado que Long . Existem drivers que tentam evitar essa sobrecarga.

O outro problema é que você verá uma melhoria de desempenho se fechar o intervalo para o primeiro campo do índice. Então, se você usar o índice sugerido por baloo :
db.collection.ensureIndex({start: 1, final: 1})

Sua consulta terá um desempenho (potencialmente muito) melhor se a consulta for:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
                    final:{$lt:DateTime(...)}})

Conceitualmente, se você pensar nos índices como uma árvore, o intervalo fechado limita os dois lados da árvore em vez de apenas um lado. Sem o intervalo fechado, o servidor precisa "verificar" todas as entradas com um start maior que o timestamp fornecido, pois não conhece a relação entre start e final .

Você pode até descobrir que o desempenho da consulta não é melhor usando um índice de campo único como:
db.collection.ensureIndex({start: 1})

A maior parte da economia vem da poda do primeiro campo. O caso em que este não será o caso é quando a consulta é coberta pelo índice ou a ordenação/classificação dos resultados pode ser derivada do índice.

HTH - Rob.