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.
- 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?
- ¿Está utilizando ENUM una buena práctica?
Gracias
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. –
enteros con signo (4 bytes) para los tipos de búsqueda parece un poco excesivo, ¿qué hay de tinyints sin firmar? –
Debo usar unsigned int? Tengo más de 200,000 usuarios – Tech4Wilco