如何在MySQL中将GUID / UUID设置为主(而非群集)密钥?

时间:2014-11-13 18:43:08

标签: mysql guid

原因我使用GUID / UUID作为主键:跨设备同步数据。我在服务器上有一个master数据库,然后每个设备都有自己的数据库,结构相同(虽然,不同的引擎。服务器上的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会将它用作聚类键。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

您链接的文章是关于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的任何内容都将附加到其他索引中的每个条目。这使得它们比使用整数作为主键需要更多的空间。