如何使用UUID维护插入顺序

Ale*_*cob 5 java mysql uuid

在一个宠物项目中,我开始使用UUID。该应用程序非常简单,它使用binary(16)主键将数据添加到MySQL数据库中。

为了生成PK,我以这种方式使用JUG

UUID uuid = Generators.timeBasedGenerator().generate();

然后我将其转换为字节数组:

byte[] b = UUIDUtil.asByteArray(uuid);

现在的问题是,我对行的插入顺序一无所知。如果我按ID对行进行排序,则一些较新的行将排在较旧的行之前(根据DATETIME字段)

我应该怎么做才能保持行的插入顺序(出于排序目的)?

问题的说明,UUID按ASC排序,我希望created_at处于相同顺序。

select hex(id), created_at from myTable order by id

+----------------------------------+---------------------+
| hex(id)                          | created_at          |
+----------------------------------+---------------------+
| 0913FF1FC53911E39D8D6F7C246EE143 | 2014-04-16 09:30:50 |
| 09378CB1C53911E39D8DD94CAEA8D23F | 2014-04-16 09:30:50 |
| 094A9F83C53911E39D8DDF087D0ED31A | 2014-04-16 09:30:51 |
| 0CBE40D5C0B711E38172B9CB0C485EE3 | 2014-04-10 15:50:17 |
| 0CBF5247C0B711E3817277CAF5E1D5B5 | 2014-04-10 15:50:17 |
| 0CC03CA9C0B711E381721BA12057F9E2 | 2014-04-10 15:50:17 |
| 0CC14E1BC0B711E381720505D5FFDCD3 | 2014-04-10 15:50:17 |
| 0CC2387DC0B711E38172F9A6B29EB613 | 2014-04-10 15:50:17 |
| 0CC349EFC0B711E381723D1DB8515E3F | 2014-04-10 15:50:17 |
| 0CC43451C0B711E3817257D8AFFD09B8 | 2014-04-10 15:50:17 |
| 0CC545C3C0B711E381729B3CB87CD707 | 2014-04-10 15:50:17 |
| 0CC8C835C0B711E38172CDA11992F9BC | 2014-04-10 15:50:17 |
| 0E33A6B5C08B11E396829782BD5365D2 | 2014-04-10 10:35:22 |
| 0E368CE7C08B11E39682A9F63D5EF0E6 | 2014-04-10 10:35:22 |
| 0E383A99C08B11E396825D6048BFC696 | 2014-04-10 10:35:22 |
| 128DD6C5C53911E39D8D7577DB523A2C | 2014-04-16 09:31:06 |
+----------------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)

编辑

为了澄清,我当然知道并且习惯了auto_incrementPK,我只是想看看没有它们怎么可以实现。(如果是!)

fab*_*ace 6

今天有一个保留时间戳字节顺序的新版本提案,即版本 6。

如果你想自己创建一个 UUIDv6,首先生成一个 UUIDv1 并按如下方式更改字节顺序:

From: aaaaaaaa-bbbb-1ccc-dddd-eeeeeeeeeeee (time-based, version 1)
To:   cccbbbba-aaaa-6aaa-dddd-eeeeeeeeeeee (time-ordered, version 6)
Run Code Online (Sandbox Code Playgroud)

如果您想要一个已经做到这一点的库,您可以使用uuid-creator,假设您正在使用 Java 进行编码。例子:

From: aaaaaaaa-bbbb-1ccc-dddd-eeeeeeeeeeee (time-based, version 1)
To:   cccbbbba-aaaa-6aaa-dddd-eeeeeeeeeeee (time-ordered, version 6)
Run Code Online (Sandbox Code Playgroud)

github上的项目:https ://github.com/f4b6a3/uuid-creator

如果您使用 PHP 进行编码,则可以使用 Ben Ramsey 的库。我认为这是第一个实现 UUIDv6 的项目:

github上的项目: https: //github.com/ramsey/uuid


免责声明:我是 的主要贡献者uuid-creator


小智 3

请参阅此链接 https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

在这里,作者重新排列了 UUID 以使其具有顺序性,为此他创建了一个 MySQL 用户定义函数。