Mysql 8.0 更好的支持了 UUID

时间:2022-05-07
本文章向大家介绍Mysql 8.0 更好的支持了 UUID,主要内容包括背景、不足、MySQL 8.0 的处理方法、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

背景

UUID 是大家常用的,是一个 128bit 的字符串,例如:

12345678-1234-5678-1234-567812345678

UUID 是有版本的,不同版本有不同的底层结构,RFC4122 定义了5个版本,MySQL 实现的是版本1,由 时间戳UUID版本MAC地址构成

好处

MySQL 中使用 UUID 是对 AUTO_INCREMENT PRIMARY KEY的一个很好的替代,有如下好处:

  • keys 在不同 表、库、服务器 中都是唯一的
  • 安全性更好,很难猜
  • 可以离线生成
  • 可以简化数据库复制

不足

但也有不好的地方:

  • 增加了存储空间
  • 增加了问题调试的难度
  • 有性能问题,因为长度更长,并且无序

MySQL 8.0 的处理方法

MySQL8.0 新增了3个函数:

  1. UUID_TO_BIN
  2. BIN_TO_UUID
  3. IS_UUID

通过这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');