Bonjour,
après plusieurs recherches, je ne trouve pas de sujets traitant de ma question. Voilà pourquoi j'ai décidé de la poser ici.
phpMyAdmin signale qu'il y a deux index identiques, donc un index créé inutilement => pas bon. Et je ne comprends pas pourquoi ils seraient identiques.
EXPLICATION :
- J'ai créé une table (associative) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE TABLE `livres_auteurs` ( `idPersonne` smallint(5) unsigned NOT NULL, `code_isbn` char(13) NOT NULL COMMENT 'N° identifiant du livre', UNIQUE KEY `personne_livre_uniq` (`idPersonne`,`code_isbn`) COMMENT 'UNIQUE : personne - livre', KEY `code_isbn` (`code_isbn`), KEY `pers_livre_index` (`idPersonne`,`code_isbn`) COMMENT 'index personne - livre', CONSTRAINT `livres_auteurs_ibfk_1` FOREIGN KEY (`code_isbn`) REFERENCES `livres` (`code_isbn`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `livres_auteurs_ibfk_2` FOREIGN KEY (`idPersonne`) REFERENCES `tab_personnes` (`idPersonne`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- NB : J'ai créé un index normal puis une contrainte UNIQUE sur le même groupe de champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 KEY `pers_livre_index` (`idPersonne`,`code_isbn`) UNIQUE KEY `personne_livre_uniq` (`idPersonne`,`code_isbn`)
En visualisant la structure de la table et de ses index (en cliquant sur option, en bas) tout ce passe bien mais j'ai ce message d'alertes :
"Les index personne_livre_uniq et pers_livre_index semblent identiques et l'un d'eux pourrait être supprimé. "
- MES QUESTIONS :
1/ Y a-t-il réellement duplication d'index ou contraintes ?
2/ Si oui, devrais-je donc supprimer l'index (simple) ?
3/ De façon générale, pour mieux comprendre, si cette alerte est juste, cela voudrait dire que lorsqu'on place une contrainte UNIQUE sur un champ (ou combinaison de champs), il devient inutile d'y ajouter un index ?
En fait, je croyais avoir lu quelque part que pour optimiser une base de données, lorsqu'on place une contrainte UNIQUE, il fallait impérativement y ajouter un INDEX, sinon lors des insert ou des update, le SGBD serait obligé de scanner toutes les lignes de la table pour vérifier s'il n'y a pas déjà un champ avec une valeur identique à celle qu'on veut ajouter ou mettre à jour. Or s'il y avait un INDEX sur ce champ, la vérification serait largement accélérée.
Je peux bien enlever l'index et ne laisser que la contrainte UNIQUE (s'il le faut) mais je me demande si cela ne causerait pas de problèmes de performances.
4/ Dernière question : La règle à tenir (UNIQUE seul) ou (UNIQUE + INDEX) ? Est-elle propre à mysql ou valable aussi pour tout autre SGBD ?
Merci d'avance à tous.
Partager