【问题标题】:what's the performance difference between int and varchar for primary keys主键的 int 和 varchar 之间的性能差异是什么
【发布时间】:2011-06-05 23:57:13
【问题描述】:

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

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

2) 如果整数的优化明显更好,那是为什么呢? varchars 是否有可能在未来赶上,所以最终无论如何都无所谓了?

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

【问题讨论】:

  • 您希望存储多少行?
  • 大多数系统都很小,每年可能生成不到 50,000 行。但我可能会添加需要存储更多的功能。此外,一些系统将整合来自许多不同系统的数据。它可能来自数千个系统。因此,与其试图找出最大的行数,我认为我最好只计划一个非常大的数字。除非性能影响太大。那我再考虑。

标签: sql primary-key


【解决方案1】:

对于 MySQL,根据 Alexey here 的说法,答案出人意料地是“不多”。他总结道:

所以,如果您有一个应用程序,并且您需要一些包含一组可能值的表字段,我仍然建议您使用 ENUM,但现在我们可以看到性能损失可能没有你期望。虽然在很大程度上取决于您的数据和查询。

【讨论】:

  • 您链接到的文章中的测试与他的情况并不完全相似,因为需要使用该字段以某种方式结束字符串。他的测试是比较将字符串放入 varchar 与将 uid 放入 int 并加入另一个表以获取相应的字符串。换句话说,正如 OP 所询问的那样,他并没有比较使用 int 作为键与使用 varchar 作为键。大不同。
  • 谢谢,这开始让我知道会发生什么。一位评论者建议性能与密钥的大小密切相关,这是有道理的。我对此并不担心。但我想知道 64 位 varchar 和 64 位整数之间是否有很大区别?
  • 我还没有仔细阅读文章,所以可能不直接适用。但是之后扫描 cmets 确实有助于给我一些洞察力。我只是想提一下,因为在我发布最后一条之前我没有看到 dj 的评论。
【解决方案2】:

可能不会用完整数。

例如在 MySQL 中,BigInt 的最大值是 18,446,744,073,709,551,615。因此,如果您每秒插入 1 亿行,则需要 5849 年才能用完数字。

【讨论】:

  • 我在考虑 bigint 的。但是我在这里阅读了另一个线程,有人提到某些系统不支持 bigint。我可能需要将数据导出到其中一个系统。因此,我试图避免将 bigint 转换为此类系统的字符。但我还没有完全排除它们。
  • @user568576,“系统”是指不同的dbms还是不同的操作系统?
  • “应用程序”会是一个更好的词。例如,我的用户可能需要导出数据并在电子表格中使用它。然后他们可能希望这些数据以某种方式重新合并。
【解决方案3】:
  • varchar 需要额外存储长度信息
  • 比较和排序需要整理处理
  • 由于排序规则,varchar 可能无法跨系统匹配
  • int 给出 40 亿行,bigint(8 字节)给出 18 万亿行
  • pre-bigint,我见过十进制 (19, 0),它也给出了 18 万亿行

使用varchar流泪...

明确一点:您正在开发的系统可能有超过 40 亿行(您不知道),具有复制功能,您不知道 您将使用什么 RDBMS,但您不了解 varchar 与整数有何不同?

【讨论】:

  • 澄清一下: * 所有系统加起来可能有超过 40 亿行。 * 一些数据需要被复制。 * 我从 firebird 开始,但我可能还需要 postgres。系统的不同部分会有不同的要求。我也可能改变主意。 * 这就是我问这个问题的原因。
  • 我考虑了额外的长度信息,我认为这无关紧要。但是整理的东西可能是个问题。我需要对此进行更多研究。
  • 我想我可以通过使用二进制排序来避免排序规则问题。如果我这样做了,我会在跨系统匹配时遇到任何问题吗?我的密钥将只是一系列独特的无意义位,所以我认为它们如何呈现给最终用户并不重要,如果他们碰巧看到它们。除非他们导出它们,在不知不觉中将它们转换为其他字符集,然后以某种方式重新导入它们(我不排除这是一个问题)。我错过了什么重要的东西吗?
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多