Table des matières

Indexes

Dès que l'on travaille avec des volumes de données importants, les indexes sont fondamentaux pour éviter des problèmes de performance avec la base de données.

Rôle des indexes

Sans index, quand on cherche (ou met à jour ou supprime) des données dans une table selon différents critères, le SGBD n'a d'autre de solution que de parcourir l'ensemble des enregistrements pour retourner (ou modifier ou supprimer) celles qui correspondent. Ce qui peut être très coûteux sur les gros volumes de données.

Si l'on effectue des recherches avec des critères récurrents, la création d'un index qui couvre ces critères peut considérablement améliorer les temps de réponse. Un index réalise un classement des données selon différents critères. Ainsi, on ne crée pas des indexes a priori, on crée des indexes pour optimiser des requêtes particulières. “Le but principal d'un index est de fournir une représentation ordonnée des données indexées. ” cf. https://use-the-index-luke.com/fr/sql/anatomie-dun-index/les-noeuds-feuilles

Chaque index est mis à jour chaque fois que le SGBD ajoute, modifie ou supprime un enregistrement (cela implique un coût).

Exemple :

Une table “Users” avec les colonnes :

Si les recherches (ou mise à jour ou suppressions) se font par nom et prénom, il sera avantageux de créer un index “X_users_nom-prenom” sur les noms et prénom.

Si l'on a aussi des recherches par prénom, nom, alors il sera aussi avantageux de créer un index “X_users_prénom-nom” sur les prénoms et nom.

https://sqlpro.developpez.com/cours/quoi-indexer/

Les contraintes et indexes

Contrainte Index
Check Permet de spécifier une règle que doit satisfaire la valeur de l'attribut. Exemple : price numeric CHECK (price > 0)
Primary key Le SGBD crée automatiquement un index associé
Foreign key Le SGBD ne crée pas automatiquement un index associé. Il est souvent utile de créer un index qui contienne - entre autres attributs - la clé étrangère
Not-null Beaucoup d'attributs peuvent être not null.
Unique Le SGBD crée automatiquement un index associé

Technique

TODO

Problématique de casse

Je recherche “toto” ou “Toto” ? ce n'est pas pareil ?

Voir: https://use-the-index-luke.com/fr/sql/la-clause-where/fonctions/recherche-insensible-a-la-casse

Faire et ne pas faire Voir : “EXEMPLE DE REQUÊTES À OPTIMISER”

Performances

Un index efficace peut réduire la durée d'une requête d'un facteur très important (> 5 ou 50 ou 500 selon le cas).

Un index non utilisé est contre performant car il doit être maintenu et alimenté par le SGBD.

Il est indispensable de vérifier que tout index créé est utilisé.

Il faut donc vérifier que le SGBD utilise les indexes pour les requêtes qui ont donné lieu à leur création.

Pour cela il faut exécuter la requête en question avec la commande EXPLAIN dans PostgreSQL (Chaque SGBD a une commande équivalente).

Voir : Examiner l'usage des indexes

Vues versus Indexes

TODO

Un index est relatif à une table unique.

Une vue porte sur plusieurs tables.

Références

https://use-the-index-luke.com/fr/sql/anatomie-dun-index