Bonjour/Bonsoir tout le monde
J'arrive pas à saisir l'utilité des index, je veux dire dans quel cas on les utilise?
et s'il y a un exemple ça sera super :D
Merci d'avance pour vos réponses
Version imprimable
Bonjour/Bonsoir tout le monde
J'arrive pas à saisir l'utilité des index, je veux dire dans quel cas on les utilise?
et s'il y a un exemple ça sera super :D
Merci d'avance pour vos réponses
Plusieurs posts de SQLPro en parlent, par exemple cette 1ere lecture. Sinon, il y a tout plein d'articles intéressants disponibles via :google:.
En faisant une métaphore :
lorsque tu cherches un mot dans, une citation dans un livre, préfère-tu relire le livre depuis le début, ou allez regarder à la fin du livre l'index qui permet de le retrouver du premier coup ?
en fait je comprends tout ça
mais ils me paraissent inutiles puisqu'il y a la commande select qui peut le faire avec plus de précision et plus rapidement
en plus, les index se mettent à jour à chaque fois qu'on ajoute ou modifie quelque chose dans la table, et par conséquent ils ralentissent la mémoire
Certainement pas, SELECT utilise ou non les index, mais pour cela il faut qu'ils soient présents ! et c'est leur utilisation qui fait que le SELECT est rapide, ou non.
oui, mais on peut les désactiver le temps de l’opération, mais s'ils ne sont pas réactivés, les conséquences seront sur le SELECT ...
ok je comprends (plus au moins :roll:)
merci pour vos réponses :)
En fait, ce que tu n'as pas saisi (au début du topic en tout cas), c'est que les index, tu les utilises implicitement.
Si tu as une table sur la table "personne (id, nom, prenom, age)" et deux index : idx1(id) et idx2(nom, prenom)
Voici quelques scénario :
=> Le SGBD va lire automatiquement l'index idx1, et ainsi retrouver très rapidement la ligne correspondant à l'id 586.Code:
1
2 select * from personne where id = 586;
=> Le SGBD va lire automatiquement l'index idx2, et ainsi retrouver très rapidement les lignes correspondant aux personnes appenées ainsiCode:
1
2 select * from personne where nom = 'Dupont' and prenom = 'Lucien';
=> Le SGBD va lire l'ensemble de la table pour trouver celles dont l'age est le bon.Code:
1
2 select * from personne where age = 35;
=> Le SGBD va lire l'ensemble de l'index idx2 (car il est trié comme l'ordre de tri, ce qui évite de faire un tri sur le résultat), et filtrer les lignes "manuellement", quand elles ont le bon age.Code:
1
2 select * from personne where age = 35 order by nom;
L'utilisation des index est implicite, et c'est le SGBD qui choisi pour toi.
On arrive donc face à ce genre de situations :
=> Qui prendre ? idx1 ou idx2 ? Ca dépend des statistiques des index, donc de tes données. Si tu as 10000 Lucien Dupont dans ta table, alors idx1 sera utilisé (puisqu'au plus, le SGBD va lire 1000 lignes pour filtrer les id ensuite). En revanche, si tu en a 2, c'est idx2 qui sera lu, puisque tu liras au plus 2 lignes, puis filtrer les noms et prénoms ensuite.Code:
1
2 select * from personne where nom = 'Dupont' and prenom = 'Lucien' and id between 1000 and 2000;
On se rend compte que non seulement c'est implicite, et à la discrétion du SGBD, mais qu'en plus le choix des index dépend à la fois des valeurs des données contenues dans la table, et des valeurs contenues dans les filtres de ta requête.
Et là, on se rend compte de la grande puissance de la chose : au lieu d'appliquer toujours la même règle immuable qui est bonne pour 80% des cas et catastrophique pour les 20% restants, le SGBD va toujours choisir la meilleure solution.
Merci beaucoup StringBuilder pour vos explications :ccool:
c'était le mot clé "implicitement" qui me fallait pour comprendre :mouarf:
Maintenant tout est devenu clair
Merci encore