gpt4 book ai didi

MySQL 查询性能困境 : enum vs tables

转载 作者:IT老高 更新时间:2023-10-29 00:00:45 26 4
gpt4 key购买 nike

我目前有这个架构:

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 类型字段比使用 LEFT JOIN 会更快吗?
  2. 使用 ENUM 是一种好的做法吗?

谢谢

最佳答案

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

表定义不是存储枚举值范围的好地方。这很难轻易获得,并且让您的应用程序能够修改表定义是一个安全问题(可能)。

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

通过这种设计选择,切换数据库软件变得微不足道,您无需向您的生产应用授予“ALTER TABLE”权限,并且扩展您的枚举也很容易。此外,您还减少了程序需要进行从 ENUM -> 整数转换的次数——它可以在编译时完成,而不是在每个数据库 SQL 请求中完成。

关于MySQL 查询性能困境 : enum vs tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7879540/

26 4 0