Question

J'ai une table de MySQL qui a, entre autres attributs, un horodatage, un type et une user_id.
Tous sont consultables et / ou sortable.
Est-il préférable de créer un index pour chacun d'eux, ou créer un index unique composé avec tous les trois, ou les deux?

Était-ce utile?

La solution

La réponse de Pablo est correcte, mais peut-être vous ne parviennent pas à se rendre compte qu'un indice composé pourrait être justifié.

Vous pouvez avoir plusieurs index et ayant idx1(tstamp, user_id) ne vous exclut pas d'avoir indx2(tstamp, type) ou idx1reverse(user_id, tstamp) et ainsi de suite ...

index composés sont plus utiles quand ils couvrent toutes les conditions de votre requête, de sorte que l'index que vous proposez sera le plus utile pour

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

Si vous souhaitez améliorer les performances de ces requêtes, vous pouvez envisager l'ajout d'un indice composite.

L'inconvénient des indices est qu'il ralentit toutes les opérations de mise à jour. Cependant, les applications les plus générales font beaucoup plus sélectionne alors les mises à jour (les deux dans les transactions termes à savoir le nombre de déclarations et notamment en termes de d'enregistrements affectés / récupérés) et en même temps sont beaucoup plus tolérants des mises à jour plus lentes (les utilisateurs jugent souvent la vitesse de le système non par le temps, il est nécessaire de mettre à jour un enregistrement, mais le temps nécessaire pour récupérer des enregistrements;. à nouveau YMMV et il y a des applications qui ne respectent pas ces règles)

Le mieux serait si vous aviez un moyen de tester les performances de base de données en termes de charges de travail typiques (créer des scripts SQL typiques, indépendant et reproductible, ou créer des tests unitaires au niveau de l'application) et vous pouvez objectivement régler votre base de données .

EDIT se rendent compte également que les index peuvent être ajoutés et supprimés sans affecter le système en termes de fonctionnalités. Par conséquent, vous pouvez régler vos index plus tard, lors de l'utilisation réelle du système -. Et normalement vous recueillir et le profil des requêtes lentes SQL pour la recherche des conditions qui pourraient bénéficier de l'ajout d'index

Autres conseils

Si vous allez effectuer des recherches sur ces champs séparément, vous aurez probablement besoin d'index séparés pour faire vos requêtes exécuter plus rapidement.

Si vous avez un indice comme ceci:

mysql> create index my_idx on my_table(tstamp, user_id, type);

Et vous requête est:

mysql> select * from my_table where type = 'A';

Alors my_idx ne sera pas utile que pour votre requête et MySQL va finir par faire une analyse complète de la table pour le résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top