7.1 Raisons de l'apparition des indices

Une autre chose importante sans laquelle il ne peut y avoir de bases de données, ce sont les index.

Imaginez une situation où il y a 10 millions d'utilisateurs dans la table des utilisateurs et vous souhaitez afficher tous ceux qui ont un niveau supérieur à 90. Cette requête est très simple à écrire :

SELECT * FROM user WHERE level > 90

Super, nous avons écrit la demande en moins d'une minute. Et combien de temps faudra-t-il pour exécuter cette requête depuis le serveur SQL ? Pour exécuter une telle requête, il devra parcourir 10 millions d'enregistrements, et même s'il n'y a qu'un seul enregistrement, cela prendra beaucoup de temps.

Comment ferions-nous une tâche similaire en Java ? Nous trierions d'abord la collection d'utilisateurs par niveau, puis nous pourrions très rapidement trouver les enregistrements nécessaires à l'aide d'une recherche binaire. J'espère que je n'ai pas besoin d'expliquer ce que c'est?

Très bien, mais que se passe-t-il si nous devons maintenant sélectionner des utilisateurs dont la date d'enregistrement est antérieure à 2020 ? Triez à nouveau par date d'enregistrement et utilisez la recherche binaire.

Oui, si nous effectuons un filtre sur un champ, et pas seulement une fois, mais souvent, alors il sera très utile de stocker les données triées par ce champ.

Et comment stocker des données triées simultanément par différents champs ?

Et la réponse est très simple - vous devez stocker non pas les données elles-mêmes, mais leurs index dans une table globale.

Disons qu'il y a 10 utilisateurs avec l'identifiant : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Et vous décidez de les trier par niveau, alors le tableau de leur id sera, par exemple, comme ceci : {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Et si on les trie par date, alors on obtient par exemple : {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Les tableaux de ces identifiants sont appelés index . Les éléments eux-mêmes sont grands, on ne les touche pas. En Java, on ne touche pas aux objets, mais on stocke leurs références ; en SQL, on ne touche pas aux chaînes réelles, mais on stocke leurs numéros.

Permettez-moi de réécrire ceci en code Java :

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Trier les collections ne signifie pas déplacer les éléments eux-mêmes. La collection ne stocke pas d'objets réels, mais des liens vers eux. Il en est de même pour les tables SQL. Les vraies lignes se mentent à elles-mêmes et mentent.

Et lorsque nous devons effectuer fréquemment des sélections pour un champ, nous ajoutons un autre index à la table (analogue à une nouvelle collection en Java) et trions les lignes de la table, stockons leur ordre de tri dans un fichier d'index spécial.

J'espère que la comparaison Java a aidé un peu. Un peu de pratique - et pour vous, l'utilisation d'index deviendra également la solution la plus évidente.

7.2 Ajouter des index à une table

L'index peut être spécifié immédiatement lors de la création de la table, ou ajouté après. Le plus souvent, c'est le deuxième scénario qui se produit : les index sont ajoutés à mesure que la taille de la table augmente et que l'échantillonnage des données ralentit.

Ajouter un index à une table est très simple :

ALTER TABLE table
    ADD INDEX index_name (column);

Si vous recherchez souvent des enregistrements dans plusieurs colonnes en même temps, vous pouvez spécifier un index composite : SQL utilise plusieurs colonnes pour le composer.

Ajouter un index composite à une table est également très simple :

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Les index occupent beaucoup d'espace disque, donc si vous n'avez plus besoin d'un index, vous pouvez toujours le supprimer :

ALTER TABLE table
    DROP INDEX index_name;

Les index eux-mêmes sont une partie plutôt cachée de la base de données. Ils n'affectent en rien le format d'écriture des requêtes. C'est juste que leur présence accélère l'échantillonnage des données et ralentit leur ajout et leur sauvegarde.

Mais compte tenu de l'importance de la vitesse dans le monde d'aujourd'hui et de l'espace disque bon marché, n'hésitez pas à ajouter des index pour toutes les occasions. Excusez-moi les administrateurs...