2011-11-02 12 views
7

Entiendo que con MongoDB, para que una consulta haga uso de un índice compuesto debe usar TODAS las claves en el índice, o al menos algunas de las claves comenzando desde la izquierda. Por ejemploÍndices compuestos de Mongo, usando menos que en una consulta

db.products.find({ "a":"foo", "b":"bar" }) 

Utilizará felizmente un índice formado por {a, b, c}.

Sin embargo, si desea ver los resultados:

db.products.find({"a":"foo", "c":"thing" }) 

Creo que esto no puede utilizar el índice. ¿Podría resolverse esto agregando una condición trivial en "b", p.

db.products.find({"a":"foo", "b":{ $ne : "" }, "c":"thing" }) 

Incluso cuando en realidad no importa el valor de b. La razón de esto es que actualmente tenemos 45 millones de objetos, y continuará creciendo, por lo que estamos buscando consolidar nuestros índices para ahorrar en recursos.

Muchas gracias.

+0

¿Puede dar a explicar de estas consultas? –

+0

Su comprensión es estrictamente cierta en un índice compuesto doble, pero no necesariamente en un índice compuesto triple. Al usar la explicación verá que, de hecho, se utilizará el índice a, b, c cuando consulte en a, c. –

Respuesta

3

En general, una consulta en un índice de varias columnas que no limite suficientemente las coincidencias para una de las columnas restringirá la utilidad del índice de varias columnas. En su ejemplo, el uso de criterios de consulta de {"a":"foo", "b":{$ne:""}, "c":"thing"} limitará la utilidad de un índice {a,b,c} a la coincidencia solo en a. Si sus criterios de consulta se ejecutarán con frecuencia, cree un índice {a,c,b} (o {a,c} si b no se usará en los criterios de consulta).

Utilice la función explain en sus consultas para ver si un índice se está utilizando en todo su potencial. Si explain le informa que indexOnly es true, entonces su consulta solo está usando el índice para encontrar documentos coincidentes; de lo contrario, MongoDB necesita ver cada documento para encontrar coincidencias.

Para más información, ver:

0

De hecho, el uso de las nuevas versiones de Mongo, su {a, b, c} índice será usado cuando hay una consulta en {a, c} sin condición trivial en b necesaria. Lo he verificado usando el comando de explicación.

Hay una discusión detallada de esta aquí: Mongo Triple Compound Index

Cuestiones relacionadas