web-dev-qa-db-fra.com

MongoDB, performance de la requête par expression régulière sur les champs indexés

Je veux trouver un compte par nom (dans une collection MongoDB de 50K comptes)

De la manière habituelle: on trouve avec string

db.accounts.find({ name: 'Jon Skeet' })  // indexes help improve performance!

Que diriez-vous de l'expression régulière? Est-ce une opération coûteuse?

db.accounts.find( { name: /Jon Skeet/ }) // worry! how indexes work with regex?

Éditer:

Selon WiredPrairie:
MongoDB utilise le préfixe de RegEx pour rechercher des index (ex: /^prefix.*/):

db.accounts.find( { name: /^Jon Skeet/ })  // indexes will help!'

MongoDB $ regex

30
damphat

En fait selon la documentation,

S'il existe un index pour le champ, MongoDB compare l'expression régulière aux valeurs de l'index, ce qui peut être plus rapide qu'une analyse de collection. Une optimisation supplémentaire peut se produire si l'expression régulière est une "expression de préfixe", ce qui signifie que toutes les correspondances potentielles commencent par la même chaîne. Cela permet à MongoDB de construire une "plage" à partir de ce préfixe et de ne faire correspondre que les valeurs de l'index qui se trouvent dans cette plage.

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

En d'autres termes:

Pour/Jon Skeet/regex, mongo analysera complètement les clés de l'index, puis récupérera les documents correspondants, ce qui peut être plus rapide que l'analyse de la collection.

Pour/^ Jon Skeet/regex, mongo analysera uniquement la plage commençant par l'expression régulière dans l'index, ce qui sera plus rapide.

29
m_elsayed