MySQL - 使用String作为主键

Ken*_*son 31 mysql optimization primary-key-design

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

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

SERVICEID是用于引用服务的唯一字符串ID(基本64,大写/大写+数字),类似于URL缩短器服务为URL生成ID的方式.

我理解比较字符串与整数有固有的性能问题.

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

我正在使用MySQL,(目前正在使用MyISAM引擎,但我承认并不了解所有引擎的差异).

谢谢.

为了我的目的更新,字符串实际上只是一个base62编码的整数,所以主键是一个整数,因为你不可能超过bigint的大小,所以使用其他任何东西都没有多大意义(对我而言)特殊用例)

tho*_*ter 45

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

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

例如,国家代码或州缩写已经具有标准化的字符代码,这是使用基于字符的主键而不是另外构成任意整数ID的好理由.

  • 注意:对于仅有ASCII限制代码的列而不是真实单词(例如散列,base64,标准国家代码等),使用`ascii_bin`排序规则可能是个好主意.如果使用基于utf-8的排序规则,它将为CHAR列保留每个字符3或4个字节,而不是仅保留1个字节. (5认同)
  • 虽然机会非常小,但*可能会改变.为什么要在你的PK中添加一些基本上取决于政治决定的东西?^^ (5认同)
  • 虽然我个人很愿意接受公平的说法,但是如果国家/地区代码发生​​更改,我会接受调整工作所需的工作。 (2认同)
  • 使用国家代码作为主键没有问题。是的,国家/地区代码发生​​变化。所以呢?该数据库不是只读的。并使用类型“CHAR(2) CHARSET ascii COLLATE ascii_bin”。 (2认同)