35

我已经在 Stack Overflow 上看到过类似的帖子,但不太满意。

假设我提供 Web 服务。http://foo.com/SERVICEID

SERVICEID 是用于引用服务的唯一字符串 ID(base 64,小写/大写 + 数字),类似于 URL 缩短服务如何为 URL 生成 ID。

我了解比较字符串与整数存在固有的性能问题。

但我很好奇如何最大限度地优化 String 类型的主键。

我正在使用 MySQL,(目前使用 MyISAM 引擎,尽管我承认不了解所有引擎差异)。

谢谢。

出于我的目的更新字符串实际上只是一个 base62 编码的整数,所以主键是一个整数,并且由于你不可能超过 bigint 的大小,所以使用其他任何东西都没有太大意义(对于我特定用例)

4

3 回答 3

51

使用 CHAR 或 VARCHAR 作为主键没有任何问题。

当然,在很多情况下它会比 INT 占用更多的空间,但在很多情况下,它是最合乎逻辑的选择,甚至可以减少您需要的列数,从而提高效率,避免使用单独的 ID 字段。

例如,国家代码或州缩写已经具有标准化的字符代码,这将是使用基于字符的主键而不是为每个附加组成任意整数 ID 的一个很好的理由。

于 2010-08-11T05:18:53.407 回答
0

如果您的外部 ID 是 base64,那么您的内部 ID 是二进制字符串。将其用作具有类型BINARY(n)(如果是固定长度)或VARBINARY可变长度的数据库中的键。二进制版本比 base64 版本短 3/4。

只需在您的服务中从/转换为 base64。

于 2019-11-05T15:56:16.710 回答
0

使用字符串作为主列的类型不是一个好方法,因为如果我们的值不能按顺序和增量模式生成,这可能会导致数据库碎片并降低数据库性能。

于 2021-09-11T13:50:28.713 回答