【问题标题】:MySQL - using String as Primary KeyMySQL - 使用字符串作为主键
【发布时间】:2021-09-11 21:50:28
【问题描述】:

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

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

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

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

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

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

谢谢。

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

【问题讨论】:

    标签: mysql optimization primary-key-design


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我很确定我不会有太大的不同,但我想听听社区“在那里做过”
    • 注意:对于仅是 ASCII 限制代码而非真实单词的列(例如哈希、base64、标准国家代码等),使用ascii_bin 排序规则可能是个好主意.如果您使用基于 utf-8 的排序规则,它将为 CHAR 列的每个字符保留 3 或 4 个字节,而不仅仅是 1。
    • 虽然几率很小,但可以改变。为什么要在你的 pk 中添加一些基本上取决于政治决定的东西? ^^
    • 公平点,但如果国家代码发生变化,我个人愿意接受调整所需的工作。
    • 使用国家代码作为主键没有问题。是的,国家代码更改。所以呢?数据库不是只读的。并使用类型CHAR(2) CHARSET ascii COLLATE ascii_bin
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2011-05-04
        • 2020-03-16
        • 2021-03-09
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多