Duplicate indices

Les indexes prennent de l’espace disque et de la mémoire. Les moteurs MySQL/MariaDB/PostgreSQL savent utiliser des indexes plus complexes afin de lire des données nécessitant un seul index donc les champs conditionnant sont inclus dans un index plus complexe.

Exemple ici avec 3 indexes

struct index_a {
 id_1 int,
 id_2 int,
};

struct index_b {
 id_1 int,
};

struct index_c {
 id_2 int,
};

Si nous faisons une requête filtrant sur le champ _id1 uniquement (SELECT field1 FROM table1 where id_1 = 3), le moteur de BDD est capable d’utiliser 2 indexes: _indexb, qui ne contient que _id1 et _indexa qui contient _id1 puis _id2.

En revanche, si nous faisons une requête filtrant sur le champ _id2 uniquement (SELECT field1 FROM table1 where id_2 = 6), le moteur de BDD ne pourra utiliser que _indexc.

Si nous reprenons _indexa, il n’est pas valide car le moteur de BDD lira cet index en trouvant les records discriminants sur _id1 avant les records discriminant sur _id2. Ce n’est pas un chemin optimal pour trouver un résultat dépendant uniquement de _id2. L’ordre des champs d’un index est donc important.

Pour finir, _indexa filtrant tout d’abord sur _id1 avant de filtrer sur _id2, il sait donc filtrer uniquement sur _id1 et donc _indexb est inutile (il prend des ressources disque et mémoire inutiles). Supprimez donc _indexb qui prend de l’espace disque et mémoire pour rien.