La PRIMARY KEY sert à éviter les doublons alors que l'INDEX sert à améliorer les recherches.
Si il veut optimiser ses recherches en sachant qu'il recherche sur ces 3 colonnes en majorité, l'INDEX sur 3 champs est plus adapté que la PRIMARY KEY sur 3 champs
C'est une bonne définition.
Pour ma part j'ai longtemps été perturbé par la différence/ressemblance entre KEY et INDEX. Voici ma conclusion:
Quatre types d'index:
- Index unique
- Index non unique
- Index fulltext (pour recherche sur contenu)
- clé primaire
qui se créent différemment:
- ALTER TABLE table ADD UNIQUE nom_index (colonnes)
- ALTER TABLE table ADD INDEX nom_index (colonnes)
- ALTER TABLE table ADD FULLTEXT nom_index (colonnes)
- ALTER TABLE table ADD PRIMARY KEY nom_index (colonnes)
La PRIMARY KEY n'est rien d'autre qu'un index unique à la différence que :
- une PRIMARY KEY ne peut pas contenir de valeurs nulles
- Il ne peut y avoir qu'une seule PRIMARY KEY par table mais on peut mettre plusieurs index UNIQUE.
- on ne peut pas utiliser la syntaxe CREATE INDEX avec les PRIMARY KEY (détail car CREATE INDEX est "mappée" vers ALTER TABLE...ADD qui, elle, accepte de créer des PRIMARY KEY. Je n'ai jamais bien compris cette limitation de syntaxe)
En passant, et pour revenir à la question de départ, l'utilisation des index est une arme à double tranchant. Comme l'a souligné Zeus, ils accélèrent les SELECT mais ils ralentissent les INSERT (les index sont automatiquement mis à jour lors d'une insertion).
Si on a des insert massifs à faire, on peut contourner le problème en supprimant les index (DROP INDEX) avant l'insertion puis de les recréer après. Ou mieux, grouper les insert à faire dans un fichier texte puis faire un LOAD DATA INFILE en lieu et place des INSERT. C'est *beaucoup* plus rapide.
Le choix de la composition des index n'est pas un exercice facile mais il vaut toujours mieux indexer sur une partie de colonne plutôt que sur la largeur totale de celle-ci. Si les x premiers caractères d'une colonne de type CHAR suffisent à distinguer suffisamment les lignes, l'index ne devrait porter que sur ces x premiers caractères. Comme par exemple
On indexe sur les 3 premiers octets de la colonne.
L'index sera moins volumineux sur disque mais sutout, occupera moins de place en mémoire dans le key_buffer, le cache utilisé pour stocker les index. MySQL pourra ainsi stocker de plus gros morceaux de cet index en cache et la requête sera accélérée. L'espace disque ne coûte plus rien maintenant mais la mémoire....
L'utilisation appropriée des index est un sujet délicat (mais passionnant) et trouver le bon équilibre, un exercice difficile. La solution:
- essayer
- tester (chrono)
- planter
- goto 1
