【问题标题】:How to maintain insertion order using UUID如何使用 UUID 维护插入顺序
【发布时间】:2014-04-16 08:59:41
【问题描述】:

在一个宠物项目中,我开始使用 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 |
+----------------------------------+---------------------+

编辑

澄清一下,我当然知道并且已经习惯了auto_increment PK,我只是想看看在没有它们的情况下如何工作。 (以防万一!)

【问题讨论】:

  • 为什么不只使用integer auto_increment 字段并将其用于默认排序?
  • 出于研究目的,我希望完全摆脱数据库生成的值(所以没有auto_increment)
  • 你不能按created_at排序吗?
  • UUID 不是为订购而设计的。如果要根据广告订单进行选择,则需要根据 created_by 进行排序。
  • @AlexandreJacob 为什么您需要订购插件?

标签: java mysql uuid


【解决方案1】:

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

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

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2011-02-27
      • 1970-01-01
      • 2011-10-25
      • 2011-09-18
      • 2020-07-31
      • 2011-04-11
      相关资源
      最近更新 更多