2009-12-14 19 views
31

Est-ce que l'index sur une colonne varchar rend la requête plus lente? Je peux faire cela int. et je n'ai pas besoin de faire la comparaison LIKE%.Est-ce que l'index sur Varchar fait la différence de performance?

+0

Que diriez-vous de montrer des exemples de requêtes qui illustrent ce que vous voulez dire? – wallyk

+2

"plus lent" n'a pas de sens sans quelque chose à comparer. Demandez-vous si VARCHAR est plus lent que INT, ou si VARCHAR indexé est plus lent que non indexé? –

+0

Je ne comprends pas.Si les données que vous stockez est un int, alors le type de colonne doit être int et vous indexeriez cette colonne.Si les données sont varchar, alors votre type de colonne est varchar – ram

Répondre

73

Est-ce que l'index sur une colonne varchar rend l'exécution de la requête plus lente?

Non, ce n'est pas le cas.
Si l'optimiseur décide d'utiliser l'index, la requête s'exécutera plus rapidement. INSERT s/UPDATE s/DELETE s sur cette table sera plus lente, mais pas assez probable pour le remarquer.

Je ne ai pas besoin de faire la comparaison LIKE%

Soyez conscient du fait que l'utilisation:

LIKE '%whatever%' 

... se pas utiliser un index, mais la volonté suivante :

LIKE 'whatever%' 

La clé est wildcarding le lefthan Le côté d de la chaîne signifie qu'un index sur la colonne ne peut pas être utilisé.

Sachez également que MySQL limits the amount of space set aside for indexes - ils peuvent être jusqu'à 1000 octets de long pour les tables MyISAM (767 octets pour InnoDB).

+4

Merci, je n'avais aucune idée de supprimer le caractère générique gauche utilise l'index. Je ne m'attendais pas à ce que les caractères génériques ne soient pas pris en charge du tout. – RevNoah

6

L'indexation ne ralentit pas la requête, la taille de la base de données augmente tout simplement, alors allez-y et essayez-le.

Vous devriez pouvoir obtenir de meilleures performances en récupérant des lignes mais cela dépend de vos données, de vos requêtes.

+11

Il doit être souligné que l'indexation * does * ralentit les insertions et peut tuer complètement les performances si elle pousse la taille de votre base de données au point où vous frappez régulièrement le disque. –

+0

Merci Anon.Tu as raison! – YOU

2

Vous n'allez pas ralentir vos requêtes en les indexant. Si vous pouvez rendre la colonne d'un type int, je recommanderais de le faire car la plupart des RDBMS peuvent rechercher int plus vite que varchars

9

Si vous pouvez remplacer votre colonne varchar par un nombre entier (ce que je pense est ce que vous suggérez) Ensuite, un index comprenant la colonne entier sera plus performant que la colonne varchar pour plusieurs raisons.

  1. La taille de l'index sera plus petite et impliquera moins de pagination.
  2. La comparaison des entiers est bien meilleure que celle de varchar.
+1

sur le point 2 -> où avez-vous besoin de comparaison de varchar si vous l'avez indexé, autre que la comparaison de LIKE comme indiqué dans la réponse la plus votée? – shabby

+0

Le deuxième point est si faux. quand vous indexez varchar, il devient vraiment INT pour le moteur de base de données, seul l'overhead est l'index scan – Peter

0

Il existe des problèmes de performance en ce qui concerne les insertions. Je peux à coup sûr vous dire que l'insertion dans une grande table qui a un index sur une colonne varchar peut être très lente. (jusqu'à 50x)