在ISAM MySQL表中,CHAR()或VARCHAR()作为主键?

9

我需要在MySQL中创建一个简单的表格,其中包含用户名和密码字段。由于用户名必须是唯一的,因此将其作为主键是有意义的。

作为主键,使用CHAR()还是VARCHAR()更好呢?

4个回答

9

最好使用用户ID索引,这样对于连接操作比使用char / varchar更快。现在花费的两秒钟可以帮助你避免在将来意外扩展架构功能时节省很多时间。

需要考虑的一些陷阱:

  • 假设我们在将来添加了几个表格,如果有人想要更改用户名怎么办?
  • 如果应用程序比我们预想的更成功,我们需要考虑优化,你是否真的想要重新设计你的架构以减少varchar索引的开销?

同意,你可能需要一个用户ID来代替在任何连接表中存储用户名,这样会小得多。 - Darryl Hein

6
我会努力不使用 CHAR() 或 VARCHAR() 作为主键,而使用带有自动递增的 int。这样,如果需要,在子表中可以使用该用户ID,并且对主键进行的查询应该更快。如果必须使用 CHAR() 或 VARCHAR(),我会选择 CHAR(),因为它是固定宽度的。
我不确定 MySQL 如何处理 VARCHAR(),但大多数数据库引擎都必须在幕后做一些魔法来帮助引擎知道 VARCHAR() 字段何时结束以及下一个字段从哪里开始,CHAR()则更直接并避免了引擎过多思考。

2
我会努力避免使用CHAR()或VARCHAR()作为主键,而是使用带有自动增量的int。将用户名设置为唯一约束条件,但使用int字段作为主键。

这不是问题的答案,而是建议,它不能解决问题。 - franko_camron
我想我想说的是,这个问题提出了一个次优解决方案,而这个网站的目的是传播知识。同时,相似的答案同时发布却没有被踩也有点奇怪。 - RhysC

0

我在我所工作的任何MySQL数据库中都很少看到使用CHAR。我会选择VARCHAR。

例如,对于CHAR(30),整个30个字符都存储在表中,这意味着每个条目将占用相同的空间,即使您的用户名只有10个字符长。

使用VARCHAR(30),它只会使用足够存储您输入的字符串的空间。

在小表上,这不会有太大的区别,但在大表上,VARCHAR应该能够使其整体更小。


1
在这种情况下,我认为CHAR更合适。它是一个固定长度的字段。如果表中的所有字段都是固定长度的,则查询将运行得更快,因为mysql无需计算下一条记录的起始位置。现在空间很便宜,我会在这里为了更快的速度而牺牲一点空间。 - DreamWerx
在匹配字符串时,只需注意CHAR末尾的空格即可。 - Steve T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接