Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CHAR()或VARCHAR()作为ISAM MySQL表中的主键?_Mysql - Fatal编程技术网

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

CHAR()或VARCHAR()作为ISAM MySQL表中的主键?,mysql,Mysql,我需要一个简单的表,在MySQL中有用户名和密码字段。因为用户名必须是唯一的,所以我认为将它们作为主键是有意义的 使用CHAR()或VARCHAR()作为主键更好吗 也可以只使用一个用户ID索引,join比char/varchar快得多。如果您不得不意外地扩展模式的功能,那么现在添加它所需的两秒钟可以为您节省大量时间 需要考虑的一些陷阱: 假设我们在将来的某个日期添加一些表,如果有人想更改用户名怎么办 假设应用程序比我们想象的更成功,我们必须考虑优化,你真的想在此时重做你的模式以减少varch

我需要一个简单的表,在MySQL中有用户名和密码字段。因为用户名必须是唯一的,所以我认为将它们作为主键是有意义的


使用
CHAR()
VARCHAR()
作为主键更好吗

也可以只使用一个用户ID索引,join比char/varchar快得多。如果您不得不意外地扩展模式的功能,那么现在添加它所需的两秒钟可以为您节省大量时间

需要考虑的一些陷阱:

  • 假设我们在将来的某个日期添加一些表,如果有人想更改用户名怎么办
  • 假设应用程序比我们想象的更成功,我们必须考虑优化,你真的想在此时重做你的模式以减少varchar'ed索引的开销吗

我没有看到CHAR在我处理过的任何MySQL数据库中使用得太多。我会和瓦查尔一起去

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

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


在一个小的表上,它不会有太大的区别,但在一个大的表上,VARCHAR应该证明可以使它总体上保持较小。

我会努力工作,不使用CHAR()或VARCHAR()作为主键,而是使用带有自动增量的int。这允许您在需要时在子表中使用该用户标识,并且对PK的查询应该更快。如果必须使用CHAR()或VARCHAR(),我会选择CHAR(),因为它是固定宽度的


我不是100%确定MySQL是如何处理VARCHAR()的,但是大多数数据库引擎必须在引擎盖下做一些魔术,以帮助引擎知道VARCHAR()字段的结束和下一个字段的开始,CHAR()使它直接向前,并使引擎不必考虑太多。

[我会努力避免使用CHAR()或VARCHAR()作为主键,但使用具有自动增量的整数。] +一,


设置用户名的唯一约束,但使用int字段作为PK

同意,您可能需要某个用户id,它比在任何联接表中存储用户名小得多。在这种情况下,我认为CHAR更有意义。这是一个固定长度的字段。如果表中的所有字段都是固定长度的,那么查询将运行得更快,因为mysql不能计算下一条记录的起始位置。现在空间很便宜,我会在这里交换一点空间以获得更高的速度。在与字符串匹配时,请注意字符上的尾随空格。这不是问题的答案,这是一个建议,不能解决问题。我想我的重点是问题提出了一个次优的解决方案,这个网站的目的是传播知识。同样奇怪的是,在同一时间发布的类似答案并没有降低投票率。