web-dev-qa-db-fra.com

Est-ce une bonne idée / approche d'indexer une colonne VARCHAR?

Nous utilisons PostgreSQL v8.2.3.

Il y a des tables impliquées: [~ # ~] employé [~ # ~] et [~ # ~] émailliste [~ # ~].

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)

2 tables sont jointes de telle manière que si EMPLOYEE.EMAIL1 ou EMPLOYEE.EMAIL2 n'ont pas d'entrée correspondante, ces lignes seront renvoyées.

SELECT employee.email1, employee.email2,
        e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
   FROM employee
   LEFT JOIN emaillist e1 ON e1.email = employee.email1
   LEFT JOIN emaillist e2 ON e2.email = employee.email2
 WHERE e1.email IS NULL OR e2.email IS NULL

La colonne EMAIL qui est varchar (256) de la table EMAILLIST est indexée. Maintenant, le temps de réponse est de 14 secondes.

Statistiques sur le nombre de tableaux: Actuellement, EMPLOYÉ a obtenu 165 018 enregistrements et EMAILLIST a obtenu 1 810 228 enregistrements, et les deux tableaux devraient augmenter à l'avenir.

  1. Est-ce une bonne idée/approche d'indexer une colonne VARCHAR? Cette question me vient immédiatement à l'esprit parce que nous n'avons pas indexé de colonne VARCHAR auparavant dans notre application. Les conseils/suggestions d'experts à ce sujet sont très appréciés.
  2. Avec cette requête et cet index actuels, le temps de réponse de 14 secondes est raisonnable ou existe-t-il une possibilité de réglage supplémentaire? Quelle est l'expérience/l'opinion des autres utilisateurs en temps réel sur la base de ce type de taille de tableau et de temps de réponse?

REMARQUE: Mon exigence/cas d'utilisation réel est expliqué en détail ici .

33
Gnanam

Il n'y a rien de mal à indexer une colonne varchar si vous allez faire des requêtes basées sur celle-ci. Cependant, gardez à l'esprit qu'il existe des limites à certains index et combien ils peuvent indexer dans un seul champ. Exemple, vous ne pouvez pas indexer une colonne pouvant contenir une quantité illimitée de texte. Cependant, vous devriez pouvoir faire un index sur varchar (256) sans problème. Essayez-le et analysez les améliorations des performances de vos requêtes pour voir si cela vous aide.

26
xenoterracide

Il n'y a aucun problème à indexer une colonne varchar en tant que telle

Lorsque cela peut devenir un problème, c'est lorsque vous avez la colonne varchar en tant que FK dans une table de milliards de lignes. Vous auriez alors une clé de substitution pour le PK et le FK, mais vous auriez toujours besoin d'une contrainte/d'un index unique sur la clé varchar naturelle.

Vos tables sont assez petites et les performances peuvent être liées à la clause OR. Malheureusement, le même problème s'applique quelle que soit la façon dont vous structurez la requête (et je ne connais pas suffisamment PostgresSQL pour offrir désolé)

5
gbn

Essayez de vous débarrasser de la partie "OU e2.email IS NULL" de votre requête et voyez à quelle vitesse elle s'exécute. Si elle s'exécute plus rapidement, vous pourrez peut-être l'exécuter plus rapidement avec une "union tout" "

0
Joe Love