Dans MongoDb, j'ai un index {a:1,b:1}. Est-ce que créer un autre index {a:1} est inutile car il est déjà couvert par l'autre?

Mes requêtes suivent les modèles: findOne({a:"...",b:"..."}) ou find({a:"..."}).

0
RainingChain 16 janv. 2017 à 07:27

2 réponses

Meilleure réponse

Je pense que vous n'avez pas besoin de créer un autre index {a:1}, à cause de prefixes.

Les préfixes d'index sont les premiers sous-ensembles de champs indexés. Par exemple, considérons l'indice composé suivant:

{ "item": 1, "location": 1, "stock": 1 }

L'index a les préfixes d'index suivants:

{ item: 1 }
{ item: 1, location: 1 }

Pour un index composé, MongoDB peut utiliser l'index pour prendre en charge les requêtes sur les préfixes d'index. En tant que tel, MongoDB peut utiliser l'index pour les requêtes sur les champs suivants:

  • le champ item,
  • le champ item et le champ location,
  • le champ item et le champ location et le champ stock.

Et créer un index composé est plus efficace [1] .
Et MongoDB peut utiliser une intersection de l'index entier ou du préfixe d'index [2] .

1
shA.t 16 janv. 2017 à 05:02

Consultez la documentation MongoDB Créer un index composé .

L'opération suivante crée un index croissant sur les champs article et stock:

db.products.createIndex( { "item": 1, "stock": 1 } )

En plus de prendre en charge les requêtes qui correspondent à tous les champs d'index, les index composés peuvent prendre en charge les requêtes qui correspondent au préfixe du champs d'index. Autrement dit, l'index accepte les requêtes sur le champ item comme ainsi que les champs item et stock:

db.products.find( { item: "Banana" } )
db.products.find( { item: "Banana", stock: { $gt: 5 } } )

Pour un index composé, MongoDB peut utiliser l'index pour prendre en charge les requêtes sur les préfixes d'index.

Au fait, si vous créez un index composé:

{ "item": 1, "location": 1, "stock": 1 }

MongoDB peut utiliser l'index pour les requêtes sur les champs suivants:

  • le champ article,
  • le champ article et le champ emplacement,
  • le champ article et le champ emplacement et le champ stock.

Mais ce ne serait pas aussi efficace sur item et stock.

J'espère que cela t'aides.

1
McGrady 16 janv. 2017 à 05:04