Bug #119729 Add native support for UUID v7
| Submitted: | 20 Jan 17:17 | Modified: | 21 Jan 9:27 |
|---|---|---|---|
| Reporter: | Vinicius Malvestio Grippa (OCA) | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S4 (Feature request) |
| Version: | OS: | Any | |
| Assigned to: | CPU Architecture: | Any |
[20 Jan 17:17]
Vinicius Malvestio Grippa
[21 Jan 9:27]
Roy Lyseng
Thank you for this useful feature request.
[23 Jan 12:08]
Daniƫl van Eeden
> Using standard v4 UUIDs as Primary Keys in MySQL is terrible for performance because the randomness causes massive page splitting and fragmentation in the clustered index (B-Tree). The UUID() function in MySQL creates v1 UUIDs, not v4 UUID's. > Please implement a native function, likely UUID_V7(), that generates a UUID string compliant with RFC 9562. Current alternative for this: https://github.com/lefred/mysql-component-uuid_v7 Besides UUID_V7 and possibly other versions as well you may want to include functions to - Extract the timestamp from time based UUID formats - Extract the UUID version from a UUID > Ideally, this should pair well with UUID_TO_BIN so we can easily store them as BINARY(16) for maximum efficiency, preserving the sorting characteristics of the timestamp component. The UUID_TO_BIN() and BIN_TO_UUID() functions should already work with any UUID version. The `swap_flag` option should not be needed anymore. Note that UUID_TO_BIN(UUID(), 0) is UUIDv1: 32 time_low 16 time_mid 16 ver+time_high 64 rest Note that UUID_TO_BIN(UUID, 1) is not RFC compliant: 16 ver+time_high 16 time_mid 32 time_low 64 rest Note that there is a format that is similar to UUID_TO_BIN(UUID, 1), but that is RFC compliant: UUIDv6: 32 time_high 16 time_mid 16 ver+time_low 64 rest The difference is that the location of `ver` is kept the same. So instead of `UUID_TO_BIN(@uuid, 1)` there could be a `UUID_CONVERT(v1, v6, @uuid)` that works the same but where it is always RFC compliant. And ofcourse UUID_v6() as generator function. # UUIDv1 ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time_low | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time_mid | ver | time_high | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |var| clock_seq | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` # UUIDv1 with swap_fields=1 (MySQL specific) ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ver | time_high | time_mid | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time_low | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |var| clock_seq | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` # UUIDv6 ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time_high | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | time_mid | ver | time_low | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |var| clock_seq | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | node | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ```
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.050 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.