¿Es una buena idea / enfoque indexar una columna VARCHAR?

32

Estamos usando PostgreSQL v8.2.3.

Hay tablas involucradas: EMPLEADO y EMAILLIST .

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

2 tablas se unen de tal manera que si EMPLOYEE.EMAIL1 o EMPLOYEE.EMAIL2 no tienen una entrada coincidente, esas filas serán devueltas.

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 columna EMAILque es varchar (256) de la EMAILLISTtabla está indexada. Ahora, el tiempo de respuesta es de 14 segundos.

Estadísticas de conteo de tablas: actualmente, el EMPLEADO tiene 165,018 registros y EMAILLIST tiene 1,810,228 registros, y se espera que ambas tablas crezcan en el futuro.

  1. ¿Es una buena idea / enfoque indexar una columna VARCHAR? Esta pregunta inmediatamente me llamó la atención por la razón por la que no hemos indexado una columna VARCHAR antes en nuestra aplicación. Los consejos / sugerencias de expertos sobre esto son muy apreciados.
  2. Con esta consulta e índice actuales, el tiempo de respuesta de 14 segundos es razonable o ¿hay alguna posibilidad de realizar más ajustes? ¿Cuál es la experiencia / opinión en tiempo real de otros usuarios basada en este tipo de tamaño de tabla y tiempo de respuesta?

NOTA: Mi requisito / caso de uso real se explica en detalle aquí .

Gnanam
fuente

Respuestas:

25

No hay nada de malo en indexar una columna varchar si va a hacer consultas basadas en ella. Sin embargo, tenga en cuenta que hay algunos límites para algunos índices y cuánto pueden indexar en un solo campo. Ejemplo: no puede indexar una columna que puede contener una cantidad ilimitada de texto. Sin embargo, debería poder hacer un índice en varchar (256) sin problemas. Pruébelo y analice las mejoras en el rendimiento de sus consultas para ver si ayuda.

xenoterracida
fuente
Gracias por tu valioso comentario. ¿Hay alguna posibilidad de ajustar aún más mi consulta a este respecto para reducir el tiempo de respuesta de 14 segundos?
Gnanam
2
Sin los resultados de EXPLAIN, es imposible saber qué optimizar. La versión 8.2.3 también está desactualizada, debe actualizar a una versión más nueva, tiene 4 años de retraso en el mantenimiento. Las versiones 8.3, 8.4 y 9.0 también son más rápidas en muchas situaciones. Las mejores estadísticas también ayudan a aumentar el rendimiento.
Frank Heikens
5

No hay problema al indexar una columna varchar como tal

Donde puede convertirse en un problema es cuando tiene la columna varchar como FK en una tabla de miles de millones de filas. Entonces tendría una clave sustituta para PK y FK, pero aún necesitaría una restricción / índice único en la clave varchar natural.

Sus tablas son bastante pequeñas y el rendimiento podría estar relacionado con la cláusula OR. Desafortunadamente, el mismo problema se aplica sin importar cómo se estructura la consulta (y no estoy lo suficientemente familiarizado con PostgresSQL como para ofrecerle mucho)

gbn
fuente
0

Intente deshacerse de la parte "OR e2.email IS NULL" de su consulta y vea qué tan rápido se ejecuta. Si se ejecuta más rápido, puede ejecutarlo más rápido con una "unión de todos"

Joe Love
fuente