Je ne suis pas d'accord avec certaines des réponses à cette question.
Y a-t-il une chose telle que trop d'index ?
Bien sûr. Ne créez pas d'index qui ne sont utilisés par aucune de vos requêtes. Ne créez pas d'index redondants. Utilisez des outils comme pt-duplicate-key-checker y pt-index-usage pour vous aider à découvrir les index dont vous n'avez pas besoin.
Que vont accélérer les index ?
- Conditions de recherche dans la clause WHERE.
- Conditions d'adhésion.
- Certains cas de ORDER BY.
- Quelques cas de GROUP BY.
- Contraintes UNIQUES.
- contraintes FOREIGN KEY.
- Recherche FULLTEXT.
D'autres réponses ont indiqué que les opérations INSERT/UPDATE/DELETE sont plus lentes si le nombre d'index est élevé. C'est vrai, mais considérez que de nombreuses utilisations de UPDATE et DELETE ont également des clauses WHERE et que dans MySQL, UPDATE et DELETE supportent également les JOINs. Les index peuvent être plus avantageux pour ces requêtes que la surcharge liée à la mise à jour des index.
De plus, InnoDB verrouille les lignes affectées par un UPDATE ou un DELETE. C'est ce qu'on appelle le verrouillage au niveau des lignes, mais il s'agit en fait d'un verrouillage au niveau de l'index. S'il n'y a pas d'index pour restreindre la recherche, InnoDB doit verrouiller beaucoup plus de lignes que la ligne spécifique que vous modifiez. Il peut même verrouiller tous les lignes du tableau. Ces verrous bloquent les modifications apportées par d'autres clients, même si elles ne sont pas logiquement en conflit.
Quand est-ce une bonne idée d'ajouter un index ?
Si vous savez que vous devez exécuter une requête qui bénéficierait d'un index dans l'un des cas ci-dessus.
Quand est-ce une mauvaise idée d'ajouter un index ?
Si l'index est un préfixe gauche d'un autre index existant, ou si l'index n'aide aucune des requêtes que vous devez exécuter.
Avantages et inconvénients des index multiples par rapport aux index multi-colonnes ?
Dans certains cas, MySQL peut effectuer optimisation de l'indexation et de la fusion et d'unir ou de croiser les résultats des recherches d'index indépendantes. Mais il est plus performant de définir un seul index, de sorte que la fusion des index n'est pas nécessaire.
Pour l'un de mes clients consultant, j'ai défini un index multi-colonnes sur une table many-to-many où il n'y avait pas d'index, et j'ai amélioré leur requête de jointure par un facteur de 94 millions !
La conception des bons indices est un processus complexe, basé sur les requêtes que vous devez optimiser . Vous ne devez pas établir de règles générales telles que "tout indexer" ou "ne rien indexer pour éviter de ralentir les mises à jour".
Voir aussi ma présentation Comment concevoir des indices, vraiment .