mysql - MySQL 中的大型唯一键

标签 mysql database utf-8 myisam

我正在为我正在创建的网站实现一个非常简单的用户数据库,自然我想确保我的工作尽可能接近“最佳实践”。数据库在 MySQL 中,我正在努力处理表定义。

CREATE TABLE IF NOT EXISTS 'users' (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'auto incrementing user_id of each user, unique index',
  `user_email` varchar(254) COLLATE utf8_unicode_ci COMMENT 'user''s email',
  `user_password_hash` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'user''s password in salted and hashed format',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='user data' AUTO_INCREMENT=1 ;

我从 php-login.net 借用了这个表定义,并对其进行了编辑,使 user_email 成为唯一键(原版将其作为文本字段,非唯一)。

读了一些书后,我看到一些评论说拥有这么大(254*3 字节)的唯一键/索引意味着数据库设计不佳,事实上 MySQL 的最大键长度为 1000 字节让我觉得我做错了什么。这个数据库可以改进吗?或者它是这样的吗?

我不知道 MySQL 中索引的内部工作原理以及涉及的开销量,所以我认为这么大的键很可能效率不高。

感谢您的帮助。

最佳答案

使电子邮件成为唯一索引可以作为约束并改进电子邮件的查找,但为什么不减小电子邮件字段的大小呢?您打算拥有多少个 254 个字符的电子邮件地址,您可以通过将列设为 varchar(128) 来牺牲它们吗?我不会将它用作您的主键,请保留您的自动递增 bigint。

就其他最佳实践而言,为什么要将 user_ 附加到用户表中的每一列?用户表中是否有不适用于用户记录的列?只需使用 idemail 等...编写查询时 user.iduser.emailuser.user_iduser.user_email。此外,当您在其他表中使用外键时,您只需将它们称为 user_id,由此我可以看出外键是 id用户表。在整个数据库中始终如一地执行此操作。

关于mysql - MySQL 中的大型唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13631190/

相关文章:

javascript - 在输出之前过滤 TinyMCE javascript

PHP:在数据库中存储简单缓存数组的有效方法?

php - Laravel 外键有什么问题?

php - MySQL 或 PHP 错误? IPV6

java - android.database.sqlite.SQLiteException : table has no such column

mysql - 在 Ubuntu 14.04 上读取 UTF-8 文件时发生 Flyway 错误 "Incorrect string value"

utf-8 - mod_jk utf-8 字符集设置

c - 如何获取标准输入的 UTF-8 编码值?

mysql - 将 MYSQL 备份复制到另一台服务器

MySQL复制