Index pour plusieurs colonnes dans ActiveRecord

Dans ActiveRecord, il existe deux manières de déclarer des index pour plusieurs colonnes:

  add_index: classifications, [: species,: family,: sortingvial_names] 
  add_index: classifications,: espèces
 add_index: classifications,: famille
 add_index: classifications,: sortingvial_names 

Y a-t-il une différence entre la première approche et la seconde? Si oui, quand devrais-je utiliser le premier et le deuxième?

Vous comparez un indice composite avec un ensemble d’indices indépendants. Ils sont juste différents.

Pensez-y de la manière suivante: un index composé vous permet de rechercher rapidement le premier champ dans un ensemble de champs nesteds, puis de rechercher rapidement le deuxième champ dans UNIQUEMENT les enregistrements déjà sélectionnés par le premier champ , suivis d’un examen rapide. -up du troisième champ – à nouveau, uniquement dans les enregistrements sélectionnés par les deux indices précédents.

Prenons un exemple. Votre moteur de firebase database ne nécessitera pas plus de 20 étapes pour localiser une valeur unique dans 1 000 000 enregistrements (si la mémoire est utilisée) si vous utilisez un index. Cela est vrai que vous utilisiez un index composite ou indépendant – mais UNIQUEMENT pour le premier champ (“espèce” dans votre exemple, même si je pense que vous voudriez une famille, une espèce et ensuite un nom commun).

Maintenant, supposons qu’il y ait 100 000 enregistrements correspondants pour cette première valeur de champ. Si vous ne disposez que d’index uniques, toute recherche dans ces enregistrements nécessitera 100 000 étapes: une pour chaque enregistrement extrait par le premier index. Cela est dû au fait que le deuxième index ne sera pas utilisé (dans la plupart des bases de données – cela simplifie un peu) et qu’une correspondance doit être utilisée.

Si vous avez un index composite, votre recherche est beaucoup plus rapide car votre deuxième recherche de champ aura un index dans le premier ensemble de valeurs. Dans ce cas, vous n’aurez pas besoin de plus de 17 étapes pour atteindre votre première valeur correspondante sur le champ 2 dans les 100 000 correspondances sur le champ 1 (base de journalisation 2 sur 100 000).

Donc: étapes nécessaires pour trouver un enregistrement unique à partir d’une firebase database de 1 000 000 enregistrements en utilisant un index composite sur 3 champs nesteds où le premier récupère 100 000 et le second récupère 10 000 = 20 + 17 + 14 = 51 étapes.

Les étapes nécessaires dans les mêmes conditions avec des indices uniquement indépendants = 20 + 100 000 + 10 000 = 110 020 pas.

Grande différence, hein?

Maintenant, ne vous mettez pas dans la peau en mettant des indices composites partout. Tout d’abord, ils sont chers sur les encarts et les mises à jour. Deuxièmement, ils ne sont utilisés que si vous effectuez une véritable recherche sur des données nestedes (pour un autre exemple, je les utilise pour extraire des données de connexion pour un client sur une période donnée). En outre, ils ne valent pas la peine si vous travaillez avec des ensembles de données relativement petits.

Enfin, vérifiez la documentation de votre firebase database. Les bases de données sont devenues extrêmement sophistiquées dans leur capacité à déployer des indices de nos jours et le scénario Database 101 que j’ai décrit ci-dessus peut ne pas convenir à certains (bien que je me développe toujours comme si je le savais).

Les deux approches sont différentes. Le premier crée un index unique sur trois atsortingbuts, le second crée trois index à atsortingbut unique. Les exigences en matière de stockage seront différentes, mais sans dissortingbutions, il est impossible de dire lesquelles seraient plus grandes.

L’indexation de trois colonnes [A, B, C] fonctionne bien lorsque vous devez accéder aux valeurs de A, A + B et A + B + C. Ce ne sera pas bon si votre requête (ou trouver des conditions ou autre) ne fait pas référence à A.

Lorsque A, B et C sont indexés séparément, certains optimiseurs de requêtes de SGBD envisageront de combiner plusieurs index (sous réserve de l’efficacité estimée de l’optimiseur) pour donner un résultat similaire à un seul index multi-colonnes.

Supposons que vous ayez un système de commerce électronique. Vous souhaitez interroger les commandes par purchase_date, customer_id et parfois les deux. Je commencerais par créer deux indices: un pour chaque atsortingbut.

En revanche, si vous spécifiez toujours purchase_date et customer_id, un seul index sur les deux colonnes serait probablement le plus efficace. L’ordre est significatif: si vous souhaitez également interroger des commandes pour toutes les dates pour un client, faites de customer_id la première colonne de l’index.

De la documentation:

Lors de la création d’un index sur plusieurs colonnes, la première colonne est utilisée comme nom pour l’index. Par exemple, lorsque vous spécifiez un index sur deux colonnes [: first,: last], le SGBD crée un index pour les deux colonnes ainsi qu’un index pour la première colonne: first. Utiliser uniquement le prénom pour cet index est logique, car vous n’aurez jamais à créer un index singulier avec ce nom.

Utilisez la première méthode lors de la création d’un index composé et la seconde lorsque vous créez des index sur des atsortingbuts uniques.

Il y a de bons points ici sur le moment d’utiliser des index composés , mais l’essentiel est qu’ils sont bons quand on utilise un ou plusieurs atsortingbuts. Notez qu’ils doivent être utilisés avec d’autres index (indexez toujours vos clés étrangères) – pas en remplacement.