CHAR()或VARCHAR()作为ISAM MySQL表中的主键?
我需要一个简单的表,在MySQL中有用户名和密码字段。因为用户名必须是唯一的,所以我认为将它们作为主键是有意义的CHAR()或VARCHAR()作为ISAM MySQL表中的主键?,mysql,Mysql,我需要一个简单的表,在MySQL中有用户名和密码字段。因为用户名必须是唯一的,所以我认为将它们作为主键是有意义的 使用CHAR()或VARCHAR()作为主键更好吗 也可以只使用一个用户ID索引,join比char/varchar快得多。如果您不得不意外地扩展模式的功能,那么现在添加它所需的两秒钟可以为您节省大量时间 需要考虑的一些陷阱: 假设我们在将来的某个日期添加一些表,如果有人想更改用户名怎么办 假设应用程序比我们想象的更成功,我们必须考虑优化,你真的想在此时重做你的模式以减少varch
使用
CHAR()
或VARCHAR()
作为主键更好吗 也可以只使用一个用户ID索引,join比char/varchar快得多。如果您不得不意外地扩展模式的功能,那么现在添加它所需的两秒钟可以为您节省大量时间
需要考虑的一些陷阱:
- 假设我们在将来的某个日期添加一些表,如果有人想更改用户名怎么办
- 假设应用程序比我们想象的更成功,我们必须考虑优化,你真的想在此时重做你的模式以减少varchar'ed索引的开销吗
在一个小的表上,它不会有太大的区别,但在一个大的表上,VARCHAR应该证明可以使它总体上保持较小。我会努力工作,不使用CHAR()或VARCHAR()作为主键,而是使用带有自动增量的int。这允许您在需要时在子表中使用该用户标识,并且对PK的查询应该更快。如果必须使用CHAR()或VARCHAR(),我会选择CHAR(),因为它是固定宽度的
我不是100%确定MySQL是如何处理VARCHAR()的,但是大多数数据库引擎必须在引擎盖下做一些魔术,以帮助引擎知道VARCHAR()字段的结束和下一个字段的开始,CHAR()使它直接向前,并使引擎不必考虑太多。[我会努力避免使用CHAR()或VARCHAR()作为主键,但使用具有自动增量的整数。] +一,
设置用户名的唯一约束,但使用int字段作为PK同意,您可能需要某个用户id,它比在任何联接表中存储用户名小得多。在这种情况下,我认为CHAR更有意义。这是一个固定长度的字段。如果表中的所有字段都是固定长度的,那么查询将运行得更快,因为mysql不能计算下一条记录的起始位置。现在空间很便宜,我会在这里交换一点空间以获得更高的速度。在与字符串匹配时,请注意字符上的尾随空格。这不是问题的答案,这是一个建议,不能解决问题。我想我的重点是问题提出了一个次优的解决方案,这个网站的目的是传播知识。同样奇怪的是,在同一时间发布的类似答案并没有降低投票率。