2011-10-24 18 views
16

tengo actualmente este esquema:MySQL rendimiento de las consultas dilema: enumeración vs tablas

CREATE TABLE `users` (
    `users_id` int(11) NOT NULL AUTO_INCREMENT, 
    `users_name` varchar(50), 
    `users_lastname` varchar(50), 
    `users_dob` date, 
    `users_type` int(11) NOT NULL default 0, 
    `users_access` int(11) NOT NULL default 0, 
    `users_level` int(11) NOT NULL default 0, 
    /* etc...*/ 
    PRIMARY KEY (`users_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE `users_types` (
    `types_id` int(11) NOT NULL AUTO_INCREMENT, 
    `types_name` varchar(50), 
    PRIMARY KEY (`types_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

/* etc..*/ 

Consulta:

SELECT 
    types_name AS user_type, 
    /* all other fields*/ 
    users.* 
    FROM users 
    INNER JOIN users_types ON (users.users_type=types_id); 
    /* INNER JOIN for all other tables*/ 
/* Rest of query */ 

Mi nueva solución:

CREATE TABLE `users` (
    `users_id` int(11) NOT NULL AUTO_INCREMENT, 
    `users_name` varchar(50), 
    `users_lastname` varchar(50), 
    `users_dob` date, 
    `users_type` ENUM('type1', 'type2', 'type3'), 
    `users_access` ENUM('access1', 'access2', 'access3'), 
    `users_level` ENUM('level1', 'level2', 'level3'), 
    /* etc...*/ 
    PRIMARY KEY (`users_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Consulta:

SELECT 
    * 
    FROM users 

De lo que veo es que usar ENUM es muy simple y puede ser muy rápido de ejecutar.

  1. Am I right? ¿Sería más rápido para el motor MySQL procesar un campo de tipo ENUM en lugar de tener UNIONES IZQUIERDAS?
  2. ¿Está utilizando ENUM una buena práctica?

Gracias

+1

Las tablas son buenas si se cambiará la lista de enumeración. Es solo una simple consulta de inserción/actualización. Los enum requerirían una mesa alternativa. –

+0

enteros con signo (4 bytes) para los tipos de búsqueda parece un poco excesivo, ¿qué hay de tinyints sin firmar? –

+0

Debo usar unsigned int? Tengo más de 200,000 usuarios – Tech4Wilco

Respuesta

19

Personalmente, creo que se debe usar el tipo de datos int y ENUM-ification de esos datos se debe hacer en otra capa.

La definición de tabla es un lugar pobre para almacenar su gama de valores enum. Es difícil de conseguir fácilmente, y darle a su aplicación el poder de modificar las definiciones de tabla es un problema de seguridad (posiblemente).

En su lugar, recomendaría usar un tipo INT y luego en su software, creando un modelo que interactúe con la base de datos a continuación para dar la apariencia de un ENUM.

Con esta opción de diseño, cambiar el software de la base de datos es trivial, no necesita otorgar privilegios de "ALTER TABLE" a su aplicación de producción, y ampliar su enumeración es fácil. Además, entonces estás reduciendo el número de veces que el programa necesita hacer la traducción desde ENUM -> entero - se puede hacer en tiempo de compilación en lugar de con cada solicitud SQL de base de datos.

+0

, por lo que tendrá un archivo para estas opciones en un archivo separado y las usará como define o algo, por ejemplo: define ('USER_ACCESS_ADMIN', 1) ;? – Tech4Wilco

+0

Sí, eso es lo que haría –

+0

gracias por la información – Tech4Wilco

1

1) Sí, sería más rápido, ya que el tipo de datos ENUM está indexado en la tabla en sí (es decir, sin necesidad de leer otra tabla para cada registro)

2) Sí, siempre y cuando no desee usar esos campos en ninguna otra tabla. Tan pronto como desee utilizar un campo dado en más de una tabla, debe crear una tabla de búsqueda separada para ese campo. Además, si desea que el campo tenga valores definibles por el usuario (y no les exija que modifiquen la base de datos directamente para cambiarlos), debe usar una tabla separada.

+0

Agregar entradas a una enumeración en realidad no obliga a una reconstrucción de la tabla, por lo que es más flexible de lo que piensas. – Johan

+0

Lo sé, es un poco más difícil mantenerlo cuando tienes que modificar la entrada en information_schema.columns para mantener tu lista ENUM actualizada. – Crontab

+0

Es una declaración simple de 'cambiar la columna de cambio de tabla', sin problemas en el esquema de información necesario. – Johan

Cuestiones relacionadas