regulares objects insensitive expresiones consultas avanzadas array accents regex mongodb indexing mongodb-indexes

objects - regex mongodb



Expresión regular MongoDB con campo indexado (1)

El motivo del diferencial de rendimiento aquí es probable que, con el índice habilitado, su consulta debe atravesar el índice (cargar en la memoria) y luego cargar los documentos coincidentes para ser devueltos también a la memoria. Como no está utilizando la consulta de prefijo, todos los valores en el índice se analizarán y se compararán con la expresión regular. No muy eficiente.

Cuando eliminas el índice, solo estás haciendo un escaneo de tabla y haciendo coincidir la expresión regular allí; básicamente simplificas las cosas desde la primera.

Es posible que pueda hacer que la versión indexada sea más rápida si fuera una consulta de índice cubierta , también sería más rápida si fuera un índice compuesto y necesitara combinarla con los criterios para otro campo.

Cuando utilizas una consulta de prefijo, no es que solo use un índice, pero utilizas el índice de manera eficiente, que es la clave, y por lo tanto, ves las ganancias de rendimiento reales.

Estaba creando mi primera aplicación usando MongoDB. Se creó el índice de un campo y se intentó buscar una consulta con $ regex param, que se inició en un shell.

> db.foo.find({A:{$regex:''BLABLA!25500[0-9]''}}).explain() { "cursor" : "BtreeCursor A_1 multi", "nscanned" : 500001, "nscannedObjects" : 10, "n" : 10, "millis" : 956, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : { "A" : [ [ "", { } ], [ /BLABLA!25500[0-9]/, /BLABLA!25500[0-9]/ ] ] } }

Es muy extraño, porque cuando estoy lanzando la misma consulta, pero sin índice en la recopilación, el rendimiento es mucho mejor.

> db.foo.find({A:{$regex:''BLABLA!25500[0-9]''}}).explain() { "cursor" : "BasicCursor", "nscanned" : 500002, "nscannedObjects" : 500002, "n" : 10, "millis" : 531, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : { } }

Obviamente, buscar un campo con índice sin expresiones regulares funciona mucho más rápido (es decir, buscar documentos con campo constante), pero estoy realmente interesado en el motivo de tal comportamiento.