2009-04-19 20 views

Respuesta

39

Hay un enorme rendimiento pena de a usar ENUM para operaciones tales como:

  • Consulta la lista de valores permitidos en la ENUM, por ejemplo, para rellenar un menú desplegable. Debe consultar el tipo de datos desde INFORMATION_SCHEMA y analizar la lista de un campo BLOB devuelto.

  • Altere el conjunto de valores permitidos. Requiere una declaración ALTER TABLE, que bloquea la tabla y puede hacer una reestructuración.

No soy fan de MySQL's ENUM. Prefiero usar tablas de búsqueda. Véase también mi respuesta a "How to handle enumerations without enum fields in a database?"

+4

mis valores enum serían cosas como datos demográficos (W, B, A, H, O, U) Sexo (M, F, U) y Parte (R, D, I, U) esos nunca cambiarían. para que siempre puedan codificarse en mi lógica de aplicación. Por lo tanto, consultar los valores desplegables y alterar la estructura no es tan importante. – gsueagle2008

+33

"mis valores enum ... nunca cambiarían". Me encantaría ** obtener algunas estadísticas sobre cuántas veces se ha demostrado que esa afirmación es incorrecta. – benmarks

+2

Si bien los puntos enumerados son verdaderos, ENUM es aún más rápido que UNIRSE, especialmente si está ordenando en esa columna. Para columnas como género con valores establecidos que no cambian, prefiero usar ENUM. Sin embargo, si existe la remota posibilidad de que necesite agregar o eliminar valores, vaya con UNIRSE o use CHAR/VARCHAR/TINYINT y adminístrelos en el nivel de la aplicación. Otra cosa ... MySQL no almacena el valor real en la columna, solo un índice (INT), por lo que también podría usar la cadena de texto para mostrar a los usuarios (es decir, Hombre en lugar de M) y ahorrar dinero adicional. codificación.;-) – Jabari

1

No, ver una comparación here

La ventaja radica en la legibilidad del código.

+10

De acuerdo con el artículo que vinculó, SI hay una ventaja de rendimiento al usar ENUM siempre que no esté alterando los posibles estados. –

24

Los ENUM están representados internamente por 1 o 2 bytes, según el número de valores. Si las cadenas que está almacenando son más grandes que 2 bytes y rara vez cambian, entonces un ENUM es el camino a seguir. La comparación será más rápida con una enumeración y ocuparán menos espacio en el disco, lo que a su vez puede generar tiempos de búsqueda más rápidos.

El inconveniente es que las enumeraciones son menos flexibles cuando se trata de agregar/eliminar valores.

+0

No estoy seguro a qué versión de MySQL se refiere. Pero desde 5.0, el tamaño del tipo enum es de 1 o 2 bytes depende del número de valores posibles de acuerdo con el manual: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html Since solo hay de 5 a 10 valores posibles, el tamaño debe ser de 1 byte – Lacek

+0

@Lacek ¡Tienes razón! Cambiaré la respuesta de 16 bits a 1 o 2 bytes –

9

En este artículo http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ Fernando investiga las interpretaciones de tipo Enum para consultas.

El resultado es que mientras se utiliza ENUM puede parecer un poco menos elegante desde el punto de vista del diseño (si su valor ENUM cambia algunas veces), la ganancia de rendimiento es obvia para grandes conjuntos de datos. Ver su artículo para más detalles. ¿Estás de acuerdo?