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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我目前有这样的模式:

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非常简单,可以非常快地执行。

  1. 我说得对吗?对于MySQL引擎来说,处理ENUM类型字段比离开联接更快吗?
  2. 使用ENUM是一个好的实践吗?

谢谢

提问于
用户回答回答于

就我个人而言,我认为应该使用int数据类型,并且应该在另一层对该数据进行ENUM化。

表定义是存储枚举值范围的糟糕地方。很难轻松获得,并且赋予应用程序修改表定义的权力是一个安全问题(可能)。

相反,我建议使用int类型,然后在软件中创建一个与下面的数据库交互的模型,以显示ENUM的外观。

有了这种设计选择,切换数据库软件就很简单了,不需要将“ALTERTABLE”特权授予您的生产应用程序,扩展枚举也很容易。另外,还减少了程序从ENUM->INTEGER中进行转换的次数--它可以在编译时完成,而不是使用每个数据库SQL请求。

用户回答回答于

1)是的,它会更快,因为ENUM数据类型是在表本身中索引的(即不需要为每个记录读取另一个表)

2)是的,只要您不想在任何其他表中使用这些字段。只要想在多个表中使用给定字段,就应该为该字段创建单独的查找表。另外,如果希望字段具有用户可定义的值(而不要求它们直接修改数据库以更改它们),则应该使用单独的表。

扫码关注云+社区