91 votes

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

Comme suite à "Quels sont les indices et comment puis-je les utiliser pour optimiser les requêtes dans ma base de données?" là où je suis d'essayer d'apprendre sur les index, les colonnes sont un bon indice de candidats? Spécifiquement pour une base de données MS SQL?

Après quelques recherches sur google, tout ce que j'ai lu suggère que les colonnes qui sont généralement à la hausse et unique de faire un bon indice (des choses comme MySQL auto_increment), je comprends cela, mais je suis à l'aide de MS SQL et je suis en utilisant le Guid pour les clés primaires, il semble donc que les indices ne bénéficierait pas GUID des colonnes...

99voto

Somnath Muluk Points 10173

Les index peuvent jouer un rôle important dans l'optimisation de la requête et de la recherche les résultats rapidement sur les tables. C'est donc l'étape la plus importante pour sélectionner les colonnes à être indexé. Il existe deux principaux lieux où l'on peut envisager d'indexation: les colonnes référencées dans la clause where et les colonnes utilisées dans les clauses JOIN. Bref, ces colonnes doivent être indexés en fonction de qui vous êtes nécessaire à la recherche des documents particuliers. Supposons, nous avons une table nommée acheteurs où la requête SELECT utilise les 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 */

Depuis "buyer_id" est référencé dans la partie SELECT, MySQL de ne pas utiliser de limiter les choisi de lignes. Par conséquent, il n'y a pas besoin de l'indexer. Ci-dessous est un autre exemple un peu différent de l'-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 au-dessus des requêtes first_name, last_name les colonnes peuvent être indexés comme ils sont situés dans la clause where. Aussi un champ supplémentaire, country_id from pays de table, peuvent être considérés pour l'indexation, car il est dans une clause de JOINTURE. Afin d'indexation peut être considéré comme sur tous les champs dans la clause where ou d'une clause de JOINTURE.

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

* Only index those columns that are required in WHERE and ORDER BY clauses. Indexing columns in abundance will result in some disadvantages. 
* Try to take benefit of "index prefix" or "multi-columns index" feature of MySQL. If you create an index such as INDEX(first_name, last_name), don't create INDEX(first_name). However, "index prefix" or "multi-columns index" is not recommended in all search cases. 
* Use the NOT NULL attribute for those columns in which you consider the indexing, so that NULL values will never be stored.
* Use the --log-long-format option to log queries that aren't using indexes. In this way, you can examine this log file and adjust your queries accordingly.
* The EXPLAIN statement helps you to reveal that how MySQL will execute a query. It shows how and in what order tables are joined. This can be much useful for determining how to write optimized queries, and whether the columns are needed to be indexed.

19voto

SquareCog Points 12947

Certaines personnes ont répondu à une question similaire ici: http://stackoverflow.com/questions/79241/how-do-you-know-what-a-good-index-is

Fondamentalement, cela dépend vraiment de la façon dont vous serez l'interrogation des données. Vous voulez un indice qui permet d'identifier rapidement un petit sous-ensemble de votre jeu de données qui sont pertinentes pour une requête. Si vous n'avez jamais requête par datestamp, vous n'avez pas besoin d'un index sur elle, même si c'est surtout unique. Si tout ce que vous faire est d'obtenir événements qui s'est passé dans une certaine plage de dates, vous voulez certainement une. Dans la plupart des cas, un indice sur le sexe est inutile-mais si tout ce que vous faire est d'obtenir des statistiques sur tous les hommes, et séparément, à propos de toutes les autres femmes, il pourrait être utile de votre temps à en créer un. Comprendre ce que votre requête tendances, et l'accès à de paramètre qui rétrécit l'espace de recherche le plus, et c'est votre meilleur indice.

Également tenir compte du type d'index que vous prenez, B-arbres sont bonnes pour la plupart des choses et de permettre les requêtes d'intervalle, mais hash index vous obtenir directement au point (mais ne permettent pas de plages). D'autres types d'indices ont d'autres avantages et les inconvénients.

Bonne chance!

8voto

Plasmer Points 790

Tout dépend de quelles requêtes vous attendons à poser sur les tables. Si vous demandez pour toutes les lignes avec une certaine valeur pour la colonne X, vous devrez faire un full table scan si un index ne peut pas être utilisé.

Index sera utile si:

  • La ou les colonnes d'un haut degré d'unicité
  • Vous avez souvent besoin de regarder pour une certaine valeur ou un intervalle de valeurs pour la colonne.

Ils ne seront pas utiles si:

  • Vous sélectionnez un grand % (>10 à 20%) de lignes de la table
  • Le supplément de l'utilisation de l'espace est un problème
  • Vous souhaitez optimiser la performance de l'insert. Chaque index sur une table réduit insérer et mettre à jour les performances, car ils doivent être mis à jour chaque fois que des modifications de données.

Colonnes de clé primaire sont généralement idéal pour l'indexation, parce qu'ils sont uniques et sont souvent utilisés pour la recherche de lignes.

3voto

Ash Points 31541

Un GUID de la colonne n'est pas le meilleur candidat pour l'indexation. Les index sont les mieux adaptés pour les colonnes avec un type de données qui peut être donné un certain ordre significatif, c'est à dire triés (entier, la date, etc).

Il n'a pas d'importance si les données dans une colonne est généralement à la hausse. Si vous créez un index sur la colonne, l'indice de créer sa propre structure de données qui permet de référencer les articles réels dans votre table sans se soucier stockée ordre (un index non-cluster). Par exemple, une recherche binaire peut être réalisée sur votre indice de structure de données pour fournir une récupération rapide.

Il est également possible de créer un index cluster" qui sera physiquement modifier l'ordre de vos données. Cependant, vous ne pouvez avoir un de ces par table, alors que vous pouvez avoir plusieurs index non cluster.

3voto

jwanagel Points 3531

Cela dépend vraiment de vos requêtes. Par exemple, si vous presque uniquement écrire dans une table, puis il est préférable de ne pas avoir tout les indices, ils ont juste ralentir l'écrit et jamais utilisé. Toute la colonne que vous utilisez pour jointure avec une autre table est un bon candidat pour un index.

Aussi, lisez à propos de la fonctionnalité d'Index Manquants. Il surveille le réel les requêtes utilisées à l'encontre de votre base de données et peuvent vous dire ce que les index aurait amélioré les performances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X