【问题标题】:How do I set GUID / UUID as primary (and not clustered) key in MySQL?如何在 MySQL 中将 GUID / UUID 设置为主键(而非集群键)?
【发布时间】:2014-11-13 18:43:08
【问题描述】:

我使用 GUID / UUID 作为主键的原因:跨设备同步数据。我在服务器上有一个主数据库,然后每个设备都有自己的具有相同结构的数据库(尽管引擎不同。服务器上的 MySQL,Android 设备上的 SQLite 等)。

我有read that if you're going to use GUID's as your primary key, it should at least not be the clustering key. 但是,我找不到如何使用 MySQL 来做到这一点。我能找到的只有this reference,它表示如果你有一个主键,InnoDB 将使用它作为集群键。

我错过了什么吗?

【问题讨论】:

    标签: mysql guid


    【解决方案1】:

    您链接到的文章是关于 Microsoft SQL Server 的,它让您可以选择使用哪个索引作为集群键。

    使用 MySQL 的 InnoDB 存储引擎,您别无选择。主键始终用作集群键。如果没有主键,则使用第一个非空唯一键。如果没有任何此类唯一键,InnoDB 会生成自己的内部 6 字节键作为集群键。

    因此,您可以创建一个使用 GUID 作为非唯一键的表,但实际上将其用作候选键。

    CREATE TABLE MyTable (
      guid CHAR(32) NOT NULL,
      /* other columns... */
      KEY (guid) -- just a regular secondary index, neither primary nor unique
    );
    

    但是,集群密钥有合法用途。如果您经常根据 GUID 进行查找,则使用 GUID 作为聚类键会更有效。

    使用 GUID 作为集群键的问题主要是空间问题。插入到聚集索引的中间可能会导致一些碎片,但这在 MySQL 中不一定是一个大问题。

    另一个问题是,在 InnoDB 中,二级索引隐式包含主键,因此 CHAR(32) 或用于存储 GUID 的任何内容都将附加到其他索引中的每个条目。与使用整数作为主键相比,这会使它们占用更多空间。

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 2011-02-05
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      相关资源
      最近更新 更多