我现在有这个模式:MySQL查询性能的两难境地:枚举VS表
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..*/
查询:
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 */
我的新的解决方案:
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;
查询:
SELECT
*
FROM users
从我看到的使用ENUM是非常简单的,可以非常快地执行。
- 我说错了吗? MySQL引擎处理ENUM类型字段而不是使用LEFT JOIN会更快吗?
- 使用ENUM是一种好的做法吗?
感谢
如果枚举列表将被更改,表格会很好。这只是一个简单的插入/更新查询。枚举需要一个更改表。 –
查找类型的有符号整数(4字节)看起来有点过分 - 那么unsigned tinyints怎么样? –
我应该使用unsigned int?我有超过200,000个用户 – Tech4Wilco