Sql 什么';s主键的int和varchar之间的性能差异

Sql 什么';s主键的int和varchar之间的性能差异,sql,primary-key,Sql,Primary Key,我需要为需要对等复制的系统创建一个主键方案。所以我计划以某种方式将一个唯一的系统ID和一个序列号结合起来,以得到唯一的ID。我想确保我永远不会用完ID,所以我考虑使用一个varchar字段,因为如果我开始用完,我总是可以添加另一个字符。但我已经读到,整数是更好的优化这一点。所以我有一些问题 1) 整数真的优化得更好吗?如果是,varchar和整数之间的性能差异有多大?我现在要用firebird。但我以后可能会换。或者可能支持多个数据库。所以,如果可能的话,我在寻找归纳法 2) 如果整数得到了更好

我需要为需要对等复制的系统创建一个主键方案。所以我计划以某种方式将一个唯一的系统ID和一个序列号结合起来,以得到唯一的ID。我想确保我永远不会用完ID,所以我考虑使用一个varchar字段,因为如果我开始用完,我总是可以添加另一个字符。但我已经读到,整数是更好的优化这一点。所以我有一些问题

1) 整数真的优化得更好吗?如果是,varchar和整数之间的性能差异有多大?我现在要用firebird。但我以后可能会换。或者可能支持多个数据库。所以,如果可能的话,我在寻找归纳法

2) 如果整数得到了更好的优化,为什么呢?而且,瓦查尔斯是否有可能在未来迎头赶上,所以最终也没关系了


我的varchar密钥没有任何意义,除了唯一的系统ID部分。但我可能想以某种方式掩盖这一点。此外,我计划有效地使用每个字符的所有位。例如,我不打算将整数123编码为字符串“123”。因此,我认为varchar不会比整数需要更多的空间。

对于MySQL,根据Alexey的说法,答案是令人惊讶的“不多”。他总结道:

因此,如果您有一个应用程序,并且需要一些表字段和一小组可能的值,我仍然建议您使用ENUM,但是现在我们可以看到性能影响可能没有您预期的那么大。尽管这在很大程度上取决于您的数据和查询

您可能不会用完整数

例如,在MySQL中,BigInt的最大值是18446744073709551615。因此,如果每秒插入1亿行,则需要5849年的时间才能用完数字。

  • varchar需要额外存储长度信息
  • 比较和排序需要排序规则处理
  • 由于排序规则的原因,varchar可能无法跨系统匹配
  • int给出40亿行,bigint(8字节)给出18万亿行
  • 在bigint之前,我看到了十进制(19,0),它也给出了18万亿行
使用varchar将以眼泪告终


需要明确的是:您正在开发的系统可能有超过40亿行(您不知道),有复制,您不知道将使用什么RDBMS,您不知道varchar与整数有什么不同?

您希望存储多少行?大多数系统都很小,每年可能会产生50000行以下的数据。但我可能会添加需要存储更多的功能。此外,一些系统将整合来自许多不同系统的数据。它可能来自数千个系统。因此,与其试图计算出最大行数,我认为我最好只规划一个非常大的数字。除非性能的影响太大。然后我会重新考虑。你链接到的文章中的测试与他的情况并不完全相似,因为字段被用来以某种方式结束字符串。他的测试比较了将字符串放入varchar和将uid放入int并连接到另一个表以获得相应的字符串。换句话说,他并没有像OP所问的那样,比较使用int作为键和使用varchar作为键。很大的不同。谢谢,这开始让我知道应该期待什么。一位评论者认为,性能与钥匙的大小密切相关,这是有道理的。我对此并不担心。但是我想知道64位varchar和64位整数之间是否有很大区别?我还没有仔细阅读这篇文章,所以它可能不会直接应用。不过,事后浏览评论确实有助于我了解一些情况。我只是想提一下,因为在我发布上一条评论之前,我没有看到dj的评论。我正在考虑bigint的评论。但我在这里读了另一篇文章,有人提到一些系统不支持bigint。我可能需要将数据导出到其中一个系统。因此,对于这样的系统,我试图避免将bigint转换为字符。但我还没有完全排除它们。@user568576,加上“系统”,你是指不同的dbms还是不同的操作系统?“应用程序”应该是一个更好的术语。例如,我的用户可能需要导出数据并在电子表格中使用。然后,他们可能希望以某种方式重新合并数据。澄清一下:*所有系统加起来可能有超过40亿行。*部分数据需要复制。*我从firebird开始,但我可能还需要博士后。系统的不同部分将有不同的要求。我也可能改变主意。*这就是为什么我要问这个问题。我考虑过额外的长度信息,我认为这无关紧要。但是整理的东西可能是个问题。我需要做更多的研究。我想我可以通过使用二进制排序来避免排序问题。如果我这样做了,我会在跨系统匹配时遇到任何问题吗?我的密钥将只是一系列独特的无意义的比特,因此我认为,如果它们碰巧看到它们,它们如何向最终用户表示并不重要。除非他们导出它们,否则会不知不觉地将它们转换为其他字符集,然后以某种方式重新导入它们(我不排除这是一个问题)。我错过了什么重要的事情吗?