MySQL - 使用字符串作为主键

38

我在Stack Overflow上看到了一个类似的帖子,但并不太满意。

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

SERVICEID是一个唯一的字符串ID,用于引用该服务(Base64编码,大小写+数字),类似于URL缩短服务为URL生成ID。

我知道将字符串与整数进行比较存在固有的性能问题。

但是我想知道如何最大程度地优化类型为String的主键。

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

谢谢。

更新 为我的目的,字符串实际上只是一个base62编码的整数,因此主键是整数,并且由于您不太可能超过bigint的大小,因此没有什么比其他东西更有意义(对于我的特定用例)。

3个回答

58

使用CHAR或VARCHAR作为主键并没有什么问题。

当然,在很多情况下,它会占用比INT更多的空间,但是在许多情况下,这是最合适的选择,甚至可以通过避免需要单独的ID字段来减少所需的列数,提高效率。

例如,国家代码或州缩写已经具有统一的字符代码,这是使用基于字符的主键而不是为每个人造一个任意整数ID的好理由。


谢谢,我相当确定这不会有太大的差别,但我想听听已经“走过这条路”的社区的意见。 - Kenny Cason
7
注意:对于仅限ASCII编码的列(例如哈希值、Base64编码、标准国家代码等),使用“ascii_bin”排序规则可能是个好主意。如果使用基于utf-8的排序规则,CHAR列每个字符将保留3或4个字节,而不是只有1个。 - thomasrutter
@displayname 你为什么这么说? - thomasrutter
5
尽管机会很小,但它仍然有可能改变。为什么要给你的投注添加取决于政治决策的因素呢?^^ - Stefan Falk
3
公平的观点,但我个人愿意承担必要的工作来调整事情,如果国家代码改变的话。 - thomasrutter
2
在使用国家代码作为主键方面没有问题。是的,国家代码会发生变化。那又怎样呢?数据库不是只读的。并且请使用类型 CHAR(2) CHARSET ascii COLLATE ascii_bin - dolmen

0
如果您的外部ID是base64格式,那么您的内部ID就是一个二进制字符串。在数据库中,将其作为键,并使用BINARY(n)(如果长度固定)或VARBINARY(如果长度可变)类型。二进制版本比base64格式的短3/4。
而在您的服务中,只需进行base64格式和二进制之间的转换即可。

0

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


请链接数据库的参考文献以支持它。 - Kangur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接