2010-11-04 8 views
19

Dans docs pour divers ORM ils fournissent toujours un moyen de créer des index, etc. Ils mentionnent toujours pour être sûr de créer les index appropriés pour l'efficacité, comme si c'est une connaissance inhérente à un SQLer non-manuscrit qui doit utiliser un ORM. Ma compréhension des index (en dehors de PK) est essentiellement: Si vous envisagez de faire LIKE requêtes (c.-à-d., Recherche) en fonction du contenu d'une colonne, vous devez utiliser un index de texte intégral pour cette colonne. Que devrais-je savoir d'autre en ce qui concerne les index (concernant principalement l'efficacité)? J'ai l'impression qu'il y a un monde de connaissances à ma porte, mais il y a un énorme tapis de souris plié en dessous, donc je ne peux pas passer à travers (je ne sais pas pourquoi j'avais l'impression de devoir le dire, mais merci de fournir le canapé).Comment savoir quand indexer une colonne et avec quoi?

Répondre

21

penser à un indice très à peu près comme l'indice dans le dos d'un livre. C'est une zone totalement distincte du contenu du livre, où si vous cherchez une valeur spécifique, vous pouvez aller à l'index et le rechercher (les index sont ordonnés, donc trouver des choses là-bas est beaucoup plus rapide que de numériser chaque page du livre). L'entrée d'index a un numéro de page, de sorte que vous pouvez ensuite accéder rapidement à la page recherchant votre sujet. Un index de base de données est très similaire. c'est une liste ordonnée des informations pertinentes dans votre base de données (les champs inclus dans l'index), avec des informations pour la base de données pour trouver les enregistrements qui correspondent. Donc ... vous créez un index lorsque vous avez des informations à rechercher fréquemment. Les index normaux ne vous aident pas pour les recherches 'partielles' comme les requêtes LIKE, mais chaque fois que vous avez besoin d'un ensemble de résultats où le champ X a une certaine valeur, ils empêchent le SGBD de 'scanner' toute la table , à la recherche de valeurs correspondantes.

Ils aident également lorsque vous avez besoin de trier sur une colonne.

Une autre chose à garder à l'esprit; Si le SGBD vous permet de créer des index uniques comportant plusieurs champs, veillez à en étudier les effets spécifiques à votre SGBD. Un index qui inclut plusieurs champs est susceptible d'être entièrement (ou pas du tout) utile si tous ces champs sont utilisés dans une requête. Inversement, avoir plusieurs index pour une seule table, avec un champ par index, peut ne pas être d'une grande aide (ou aucune) pour les requêtes filtrées/triées par plusieurs champs.


Vous avez mentionné les index de texte intégral et les PK (clés primaires). Ils sont différents des index réguliers, bien qu'ils servent souvent des objectifs similaires. Tout d'abord, notez qu'une clé primaire est généralement un index (en MSSQL, un 'index clusterisé', en fait), mais ce n'est pas forcément le cas. A titre d'exemple, un PK MSSQL est un index clusterisé par défaut; Les index clusterisés sont spéciaux car ils ne constituent pas un bit distinct de données stockées ailleurs, mais les données elles-mêmes sont classées dans la table dans l'ordre par l'index clusterisé. C'est pourquoi un PK populaire est une valeur int qui est générée automatiquement avec des valeurs croissantes séquentielles. Ainsi, un index clusterisé trie les données de la table en fonction de la valeur du champ. Comparez cela à un dictionnaire traditionnel; les entrées elles-mêmes sont triées par la 'clé', qui est le mot en cours de définition. Mais dans MSSQL (vérifiez la documentation de votre SGBD pour votre information), vous pouvez changer l'Index Clustered pour qu'il soit un champ différent, si vous voulez. Parfois, ceci est fait sur des champs basés sur datetime.


Les index de texte intégral sont entièrement différents types de bêtes. Ils utilisent certains des mêmes principes, mais ce qu'ils font n'est pas exactement le même que les index normaux, que je décris. En outre: dans certains SGBD, les requêtes LIKE font et non utilisent l'index de texte intégral; Des opérateurs de requête spéciaux sont requis. Ces index sont différents parce que leur but n'est pas de trouver/trier sur la valeur entière de la colonne (un nombre, une date, un peu de données char), mais plutôt de trouver des mots/phrases individuels dans le texte champ (s) en cours d'indexation.

Ils peuvent également souvent permettre la recherche de mots similaires, de temps différents, d'orthographes communes et similaires, et ignorent généralement les mots parasites. La façon différente dont ils travaillent est pourquoi ils peuvent aussi avoir besoin de différents opérateurs pour les utiliser. (encore une fois, vérifiez votre documentation locale pour votre SGBD!)

+3

Excellent, merci. Donc, fondamentalement, un index est juste une liste de valeurs d'une colonne, chacune avec un lien vers la ligne correcte (je suppose que ce serait le PK). Le SGBD devrait sinon parcourir les lignes de la table, en ne regardant que la colonne pertinente pendant la recherche d'un résultat. Si c'est (à peu près) correct, votre réponse m'a beaucoup aidé. – orokusaki

+0

@orokusaki J'ai modifié votre commentaire comme vous l'avez noté. (Les mods peuvent éditer sans limite de temps). Bonne clarification! –

Questions connexes