MySQL 查询性能困境 : enum vs tables

标签 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..*/

查询:

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/

相关文章:

php - mysqli_multi_query 未插入到 mysql 数据库

PHP 内连接类别

performance - Asp.net Mvc 2 DisplayFor 性能问题?

java - 为什么这些 Java 枚举会改变值?

swift - 我可以使 Swift 枚举泛型,以便我可以使用它的 case 来推断泛型类的类型吗?

php - 优化昂贵的 php 查询/子查询

php - 如何从 XML 读取所有产品

performance - 测量 js 执行时间是否可以判断应用程序响应请求的速度?

使用具有复杂检查的局部变量的多个 && 的 C# 性能 - 编码风格与性能

java - 如何从接口(interface)获取枚举到实现该接口(interface)的类?