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

时间:2020-03-06 15:03:18  来源:igfitidea点击:

我需要一个简单的表,其中包含mySQL中的用户名和密码字段。由于用户名必须唯一,因此对我来说,将它们设置为主键是有意义的。

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

解决方案

可能只使用一个用户ID索引,对于连接vs char / varchar来说,它要快得多。如果我们不小心扩展了架构的功能,那么现在添加所需的两秒钟可以为我们节省很多时间。

需要考虑的一些陷阱:

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

我没有看到CHAR在我研究过的任何MySQL数据库中使用过多。我会选择VARCHAR

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

使用VARCHAR(30),它将仅使用足够的空间来存储我们输入的字符串。

在较小的表上不会有太大的区别,但是在较大的表上,VARCHAR应该证明可以使整体较小。

我会努力不使用CHAR()或者VARCHAR()作为PK,而要使用带有auto_increment的int。这样,我们可以根据需要在子表中使用该user_id,并且对PK的查询应该更快。如果我们必须使用CHAR()或者VARCHAR(),那么我会选择CHAR(),因为它的宽度是固定的。

我不是100%知道MySQL如何处理VARCHAR(),但大多数数据库引擎必须在后台做一些魔术,以帮助引擎知道VARCHAR()字段在哪里结束以及下一个字段在哪里开始,即CHAR( )使其变得直截了当,并使引擎不必考虑太多。

[我会努力不将CHAR()或者VARCHAR()用作PK,而应将int与auto_increment一起使用。]
+1

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