2008-09-22 20 views
20

Acabo de ejecutar un "ANÁLISIS DE PROCEDIMIENTO()" en una de mis tablas. Y tengo esta columna que es de tipo INT y solo contiene valores del 0 al 12 (ID de categoría). Y MySQL dijo que sería mejor con un ENUM ('0', '1', '2', ..., '12'). Las categorías son básicamente estáticas y no cambiarán en el futuro, pero si lo hacen, puedo modificar esa columna y agregarla a la lista ENUM ...¿Por qué ENUM es mejor que INT

¿Por qué ENUM es mejor en este caso?

editar: Estoy interesado principalmente en el aspecto de rendimiento de esta ...

Respuesta

27

En pocas palabras, es porque está indexado de una manera diferente.

En este caso, ENUM dice "Es uno de estos 13 valores", mientras que INT dice "Podría ser cualquier número entero".

Esto significa que la indexación es más fácil, ya que no tiene que tener en cuenta la indexación para los enteros que no usa "por si acaso" alguna vez los usa.

Todo tiene que ver con los algoritmos.

Me interesaría a mí mismo cuando llegue a un punto en el que el INT sería más rápido que el ENUM.

El uso de números en un ENUM podría ser un poco peligroso, aunque ... como si enviara este número sin citar a SQL, ¡podría terminar recuperando el valor equivocado!

3

porque introduce una restricción sobre los valores posibles.

2

No soy un experto en MySQL, pero supongo que los enteros siempre ocupan cuatro bytes de espacio donde las enumeraciones ocupan diferentes cantidades de espacio según el rango de datos necesarios. Como solo necesita 13 elementos, podría salirse con la suya usando 1 byte para su columna.

+0

También puede usar enteros de 1 byte (tinyint) – Zaffy

1

En Oracle tendría un índice BITMAP que es mucho más rápido que una búsqueda basada en hash para una cantidad tan pequeña de valores. (Así que supongo que hay un beneficio similar en la optimización de consultas o indexación disponible para MySQL.)

Curiosamente, los documentos de MySQL sugieren que el uso de "cosas que parecen números" es una mala opción para el tipo ENUM debido a la posible confusión entre el valor enum y el índice enum (http://dev.mysql.com/doc/refman/5.0/en/enum.html).

18

¡Yikes! Hay un montón de ambigüedades con el uso de números en un campo ENUM. Ten cuidado. El uno de gotcha que recuerdo es que se puede acceder a los valores de ENUMS por el índice: si su enumeración es ENUM('A', 'B', 'C', '1', '2, '3'), a continuación, estas dos consultas son muy diferentes:

INSERT INTO TABLE (example_col) VALUES('1'); -- example_col == 1 
INSERT INTO TABLE (example_col) VALUES( 1 ); -- example_col == A 

Estoy asumiendo la recomendación es porque limita los valores válidos eso puede entrar en la mesa. Por ejemplo, insertar 13 debería tener la opción predeterminada.

Una mejor opción sería utilizar TINYINT en lugar de INT. un UNSIGNED TINYINT tiene un rango de 0 a 255 y solo toma 1 byte to store. Un INT toma 4 bytes para almacenar. Si desea restringir los valores que entran en la tabla, puede agregar activadores ON INSERT y ON UPDATE que verifican los valores.

Si le preocupa la diferencia de rendimiento entre ENUM y TINYINT, siempre puede comparar para ver los diferentes. This article parece algo relevante.

Cuestiones relacionadas