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

Quelles colonnes font généralement de bons index ?

Les index peuvent jouer un rôle important dans l'optimisation des requêtes et la recherche rapide des résultats à partir des tables. Il est donc l'étape la plus importante de sélectionner les colonnes à indexer. Il existe deux endroits principaux où nous pouvons envisager l'indexation :les colonnes référencées dans la clause WHERE et les colonnes utilisées dans les clauses JOIN. En bref, ces colonnes doivent être indexées par rapport auxquelles vous devez rechercher des enregistrements particuliers. Supposons que nous ayons une table nommée acheteurs où la requête SELECT utilise des index comme ci-dessous :

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

Puisque "buyer_id" est référencé dans la partie SELECT, MySQL ne l'utilisera pas pour limiter les lignes choisies. Il n'y a donc pas grand besoin de l'indexer. L'exemple ci-dessous est un autre exemple peu différent de celui ci-dessus :

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

Selon les requêtes ci-dessus first_name, les colonnes last_name peuvent être indexées car elles se trouvent dans la clause WHERE. De plus, un champ supplémentaire, country_id de la table des pays, peut être pris en compte pour l'indexation car il se trouve dans une clause JOIN. Ainsi, l'indexation peut être envisagée sur chaque champ de la clause WHERE ou d'une clause JOIN.

La liste suivante propose également quelques conseils que vous devez toujours garder à l'esprit lorsque vous avez l'intention de créer des index dans vos tables :

  • Indexez uniquement les colonnes requises dans les clauses WHERE et ORDER BY. L'indexation de colonnes en abondance entraînera certains inconvénients.
  • Essayez de profiter de la fonctionnalité "préfixe d'index" ou "index multi-colonnes" de MySQL. Si vous créez un index tel que INDEX(first_name, last_name), ne créez pas INDEX(first_name). Cependant, "préfixe d'index" ou "index multi-colonnes" n'est pas recommandé dans tous les cas de recherche.
  • Utilisez l'attribut NOT NULL pour les colonnes dans lesquelles vous envisagez l'indexation, afin que les valeurs NULL ne soient jamais stockées.
  • Utilisez l'option --log-long-format pour consigner les requêtes qui n'utilisent pas d'index. De cette façon, vous pouvez examiner ce fichier journal et ajuster vos requêtes en conséquence.
  • L'instruction EXPLAIN vous aide à révéler comment MySQL exécutera une requête. Il montre comment et dans quel ordre les tables sont jointes. Cela peut être très utile pour déterminer comment écrire des requêtes optimisées et si les colonnes doivent être indexées.

Mise à jour (23 février 15) :

Tout index (bon/mauvais) augmente le temps d'insertion et de mise à jour.

En fonction de vos index (nombre d'index et type), le résultat est recherché. Si votre temps de recherche va augmenter à cause de l'index, alors c'est un mauvais index.

Probablement dans n'importe quel livre, la "page d'index" pourrait avoir une page de début de chapitre, un numéro de page de sujet commence, ainsi que des débuts de page de sous-sujet. Quelques éclaircissements dans la page d'index peuvent aider, mais un index plus détaillé peut vous dérouter ou vous effrayer. Les index ont également de la mémoire.

La sélection de l'index doit être judicieuse. Gardez à l'esprit que toutes les colonnes ne nécessitent pas d'index.