2010-02-15 13 views
9

Tengo un mapa de cadenas a enteros. Para almacenar este mapa en una base de datos MySQL creé la siguiente tabla:¿Es una forma correcta de indexar la columna TEXT de la base de datos MySQL?

CREATE TABLE map(
    Argument TEXT NOT NULL, 
    Image INTEGER NOT NULL 
) 

he elegido el tipo de texto para la discusión porque su longitud es impredecible, actualmente el registro más largo tiene 2290 caracteres y la longitud media es de 88 caracteres.

Después de conocer los problemas de rendimiento intenté agregar el índice en la columna Argument, pero encontré que debo especificar la longitud, así que para evitar esta limitación agregué una nueva columna entera que contenía valores hash (md5 o más) de Valores de columna de argumento.

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER; 

y el índice combinado

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80)); 

Desde ese momento los problemas con el rendimiento ha desaparecido. Me gustaría preguntar si es una forma correcta de resolver este problema.

Respuesta

3

No creo que exista una forma "correcta", depende para qué se utiliza la columna.

En mi experiencia, es inusual tener que/querer seleccionar en una columna de texto grande; el texto generalmente es recuperado por alguna otra clave (a menos que esté indexado de alguna otra manera, por ejemplo, texto completo, Lucene, pero eso no parece ser lo que está haciendo)

Si de hecho necesita una copia exacta coincidir en un campo grande, entonces puede ser más eficiente usar el hash ya que probablemente le permita mantener el índice más pequeño. Supongo que si necesita usar un tamaño de índice más grande que el tamaño del hash (depende de qué tan cerca del inicio del TEXTO los valores generalmente difieran), use el hash.

Su mejor opción es probarlo y ver. Perfile ambos enfoques con datos representativos y descubra.

+1

Encontré que VARCHAR puede ser un mejor tipo de columna para usar con los índices, porque VARCHAR, a diferencia de TEXT, se almacena en línea y ofrece un mejor rendimiento para los datos de acceso frecuente. http://stackoverflow.com/users/144287/brenton-alker –

Cuestiones relacionadas