Mysql
 sql >> Base de données >  >> RDS >> Mysql

DO et DONT pour les index

De manière générale :

1. N'ajoutez pas d'index sauf si vous en avez réellement besoin.

Chaque index rend les écritures plus lentes...

2. Un index sera utilisé sur les clauses where :

-- index on foo (bar)
select bar from foo where bar = :bar;

De la même manière, il sera utilisé dans les références de clé étrangère (sur les deux tables).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. Un index sera utilisé pour le tri, en particulier lorsqu'il est lié à une limite :

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Les index multicolonnes sont parfois utiles lorsque 2. et 3. s'appliquent tous les deux.

Dans ce cas, placez les conditions où en premier et la clé de tri en dernier :

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Tenez à jour les statistiques de votre table.

Si les statistiques de la table sont nulles, il y a peu de chances que l'optimiseur utilise vos index. Aspirez/analysez manuellement votre base de données si nécessaire.

6. L'utilisation de l'index dépend de la répartition de votre table.

Passé un certain seuil de lignes récupérées, il sera plus rapide de faire une analyse complète de la table. Si votre index est sur un champ booléen qui divise plus ou moins votre table en deux, il ne sera jamais utilisé.

De même, si vos données sont stockées de telle manière que l'analyse de l'index finira probablement par accéder de manière aléatoire à presque toutes les pages de disque applicables pour cette table, le planificateur préférera une analyse complète de la table.

7. Considérez les index partiels/d'expression lorsqu'ils sont disponibles.

Si vous avez un champ qui a la même valeur à l'exception de 10 % de vos lignes, envisagez un index partiel dessus (c'est-à-dire où pas cette valeur). Cela se traduit par un index beaucoup plus petit sans entraver son utilité réelle.

Si vous interrogez constamment une expression appliquée à votre colonne et que votre plateforme propose des index d'expression, envisagez d'y ajouter un index. Lorsqu'elle est utilisée, l'expression ne sera pas évaluée pour chaque ligne.