MySQL查询性能困境:枚举vs表

Tec*_*lco 16 mysql performance enums

我目前有这个架构:

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..*/
Run Code Online (Sandbox Code Playgroud)

查询:

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 */
Run Code Online (Sandbox Code Playgroud)

我的新解决方案:

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;
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT
    *
    FROM users
Run Code Online (Sandbox Code Playgroud)

从我看到的是使用ENUM非常简单,可以非常快速地执行.

  1. 我对吗?MySQL引擎处理ENUM类型字段而不是LEFT JOIN会更快吗?
  2. 使用ENUM是一种很好的做法吗?

谢谢

Rob*_*tin 19

就个人而言,我认为应该使用int数据类型,并且应该在另一层中完成该数据的ENUM化.

表定义是存储枚举值的不良位置.很难轻松搞定,并且让应用程序能够修改表定义是一个安全问题(可能).

相反,我建议使用INT类型,然后在您的软件中创建一个与下面的数据库交互的模型,以给出ENUM的外观.

有了这个设计选择,切换数据库软件是微不足道的,您不需要为您的生产应用程序授予"ALTER TABLE"权限,并且扩展您的枚举很容易.另外,您正在减少程序从ENUM转换所需的次数 - >整数 - 它可以在编译时完成,而不是在每个数据库SQL请求中完成.