前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql 8.0 更好的支持了 UUID

Mysql 8.0 更好的支持了 UUID

作者头像
dys
发布于 2018-04-04 05:31:38
发布于 2018-04-04 05:31:38
5.4K04
代码可运行
举报
文章被收录于专栏:性能与架构性能与架构
运行总次数:4
代码可运行

背景

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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字符

用法示例:

  • 建表
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t (id binary(16) PRIMARY KEY); 
  • 插入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t VALUES(UUID_TO_BIN(UUID()));
  • 查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,将会生成连续的有序值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));

IS_UUID 可以帮助我们验证传递过来的参数是否为有效的 UUID,合法的 UUID 是由 32个十六进制字符与几个可选字符('{', '-', '}')构成

下面几个示例都会返回 true,是合法的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT is_uuid('{12345678-1234-5678-1234-567812345678}'); 
SELECT is_uuid('12345678123456781234567812345678'); 
SELECT is_uuid('12345678-1234-5678-1234-567812345678');
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高性能架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java开发和MySQL DBA关于uuid干的架友好的解决了
这是为什么呢? 原因: 现在使用MySQL基本默认指的InnoDB引擎,InnoDB是聚集索引表,所有的数据按主键排序存储。所以对于从小到大的数据做主键插入不会引起数据页的拆分,可以实现数据高效的写入,另一方面普通索引包含主键存储,所以要求主键尽可能的短小,减少空间的浪费。 对于使用自增列(int 4byte,bigint 8byte),如果使用uuid产生的是一个无序的36byte的字符(前面是乱的),造成写入的性能会越来越差,表的数据量在1000万以内,可能性能差别还不大。
阿炳数记
2021/07/15
1.1K0
Java开发和MySQL DBA关于uuid干的架友好的解决了
python uuid库的使用
python 的uuid库是用来生成一串唯一表示的包,uuid是一个 32 位的16进制数,用来设置唯一的辨识信息,具体uuid功能查看维基百科
py3study
2020/01/13
3.7K0
UUID
UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统可以不借助中心节点,就可以生成UUID来标识一些唯一的信息;
Dean0731
2021/03/05
4K0
淘宝数据库,主键如何设计的?(文末福利)
某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显的错误就是关于MySQL的主键设计。
小熊学Java
2023/07/16
5370
淘宝数据库,主键如何设计的?(文末福利)
淘宝数据库,主键如何设计的?
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显 的错误就是关于MySQL的主键设计。
一个风轻云淡
2022/11/15
1.6K0
淘宝数据库,主键如何设计的?
Vue使用uuid-npm快速生成uuid,适用于多种场景
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
德顺
2023/08/25
2.1K0
Vue使用uuid-npm快速生成uuid,适用于多种场景
MySQL 8.0中的新增功能
原文:https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/
shaonbean
2019/05/26
2.5K0
Vue使用uuid-npm快速生成uuid,适用于多种场景
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
德顺
2020/08/19
25.2K0
Vue使用uuid-npm快速生成uuid,适用于多种场景
MySQL 8.0.23新特性 - 不可见列
在MySQL 8.0.23之前,表中所有的列都是可见的(如果您有权限的话)。现在可以指定一个不可见的列,它将对查询隐藏。如果显式引用,它可以被查到。
老叶茶馆
2021/02/23
1.5K0
MySQL 8.0.23新特性 - 不可见列
JS生成UUID
一、UUID是什么   UUID就是Universal Unique IDentifier的缩写,它是一个128位,16字节的值,并确保在时间和空间上唯一。 它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。         通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几
庞小明
2018/03/09
15.4K0
UUID介绍与使用范围
描述:通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准是在计算机系统中用来标识信息的一个 128 位(比特)的数字,最初被用在阿波罗网络计算机系统(NCS)中,亦为自由软件基金会组织会(OSF)在分散式计算环境领域境(DCE)的一部份。
全栈工程师修炼指南
2020/10/23
2.8K0
MySQL 8.0 体验 UUID v7
UUID v7 和 UUID v1 之间存在几个显著的区别,主要体现在生成方式、结构、安全性和适用场景等方面。
贺春旸的技术博客
2024/12/20
5340
数据库避坑指南:MySQL里那些常见的错误设计规范,你中了几个?
依托于互联网的发达,我们可以随时随地利用一些等车或坐地铁的碎片时间学习以及了解资讯。同时发达的互联网也方便人们能够快速分享自己的知识,与相同爱好和需求的朋友们一起共同讨论。
Java_老男孩
2021/07/19
1.1K0
数据库避坑指南:MySQL里那些常见的错误设计规范,你中了几个?
MySQL 为了让你的表里有一个主键是操碎了心
在 MySQL 的开发规范中都会明确写着:MySQL InnoDB 表必须有主键,主键的选择建议:添加一个自增列作为主键,每一行的值删除后一般不会重用。但实质上, 业务开发中,还是会遇到 InnoDB 表无主键无索引的情况。
阿炳数记
2022/12/03
1.2K0
Golang 库 - uuid
UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。
twowinter
2020/04/17
14.5K0
MySQL8.0新功能列表
There are over 250 new features in MySQL 8.0. The MySQL Manual is very good, but verbose. This is a list of new features in short bullet form. We have tried very hard to make sure each feature is only mentioned once. Note the similar list for MySQL 5.7.
田帅萌
2019/04/25
1.5K0
MGR 5.7滚动升级MGR 8.0
在执行上面一条更新SQL的时候,发现了上述报错,这条数据在MGR的每个节点上都进行了查看,数据都是有的。
AsiaYe
2021/07/14
8070
第10章_索引优化与查询优化
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
5180
第10章_索引优化与查询优化
The complete list of new features in MySQL 8.0
原文出处:https://mysqlserverteam.com/the-complete-list-of-new-features-in-mysql-8-0/
老叶茶馆
2020/08/12
6840
MySQL 中查找重复数据,删除重复数据
数据库版本 Server version: 5.1.41-community-log MySQL Community Server (GPL)
很酷的站长
2022/11/27
8.2K0
MySQL 中查找重复数据,删除重复数据
相关推荐
Java开发和MySQL DBA关于uuid干的架友好的解决了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验