首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL查询性能困境:枚举与表

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

Stack Overflow用户
提问于 2011-10-25 01:41:52
回答 2查看 1.5K关注 0票数 16

我目前有这样的模式:

代码语言:javascript
复制
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..*/

查询:

代码语言:javascript
复制
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 */

我的新解决方案:

代码语言:javascript
复制
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;

查询:

代码语言:javascript
复制
SELECT
    *
    FROM users

在我看来,使用ENUM非常简单,执行起来也非常快。

  1. ,我说得对吗?MySQL引擎处理枚举类型字段是否比使用LEFT JOIN更快?
  2. 使用枚举是一种很好的做法?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-25 02:27:29

就我个人而言,我认为应该使用int数据类型,该数据的枚举应该在另一个层中完成。

表定义不适合存储枚举值的范围。这很难实现,并且赋予应用程序修改表定义的权力(可能)是一个安全问题。

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

使用这种设计选择,切换数据库软件很简单,不需要向生产应用程序授予"ALTER TABLE“特权,扩展枚举也很容易。此外,您还减少了程序需要从ENUM整数转换的次数--可以在编译时转换,而不是每次数据库->请求时转换。

票数 19
EN

Stack Overflow用户

发布于 2011-10-25 01:52:46

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7879540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档