UUID 是大家常用的,是一个 128bit 的字符串,例如:
12345678-1234-5678-1234-567812345678
UUID 是有版本的,不同版本有不同的底层结构,RFC4122 定义了5个版本,MySQL 实现的是版本1,由 时间戳
、UUID版本
、MAC地址
构成
MySQL 中使用 UUID 是对 AUTO_INCREMENT PRIMARY KEY
的一个很好的替代,有如下好处:
但也有不好的地方:
MySQL8.0 新增了3个函数:
通过这3个函数,使我们可以更方便的应用UUID,并且是对上面提到的几点不足的一个解决方案
UUID_TO_BIN
用于对 UUID 字符串进行二进制压缩,32字符-->16bit
BIN_TO_UUID
是相应的解压操作,16bit-->32字符
用法示例:
CREATE TABLE t (id binary(16) PRIMARY KEY);
INSERT INTO t VALUES(UUID_TO_BIN(UUID()));
SELECT BIN_TO_UUID(id) FROM t;
+--------------------------------------+
| BIN_TO_UUID(id); |
+--------------------------------------+
| 586bcc2d-9a96-11e6-852c-4439c456d444 |
| 5942e49a-9a96-11e6-852c-4439c456d444 |
| af0f27e2-9aad-11e6-852c-4439c456d444 |
+--------------------------------------+
通过压缩,很好的改善了存储空间过大的问题,但还存在性能问题,无序意味着要向索引树中随机位置插入,在不能很好的利用内存的情况下,将会产生不少IO操作,也就明显的影响了性能
UUID_TO_BIN
有一个可选的第二个参数,就是用来解决无序引起的性能问题的
把第二个参数设置为 true,将会生成连续的有序值
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
IS_UUID
可以帮助我们验证传递过来的参数是否为有效的 UUID,合法的 UUID 是由 32个十六进制字符与几个可选字符('{', '-', '}')构成
下面几个示例都会返回 true,是合法的
SELECT is_uuid('{12345678-1234-5678-1234-567812345678}');
SELECT is_uuid('12345678123456781234567812345678');
SELECT is_uuid('12345678-1234-5678-1234-567812345678');