如何使用UUID维护广告订单

时间:2014-04-16 08:59:41

标签: java mysql uuid

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

以这种方式使用JUG生成PK&#m; m:

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 |
+----------------------------------+---------------------+

修改

只是为了澄清,我当然知道并且已经习惯了auto_increment PK,我只想看看如果没有它们,它是如何实现的。 (万一是!)

2 个答案:

答案 0 :(得分:2)

请看这个链接 https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

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

答案 1 :(得分:2)

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

如果要自己创建一个UUIDv6,请首先生成一个UUIDv1并按以下方式调整字节顺序:

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

如果您想要一个已经完成的库,则可以使用uuid-creator,假设您使用Java进行编码。示例:

// Generate a UUIDv6
UUID uuid = UuidCreator.getTimeOrdered();

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

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

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

相关问题