首页
学习
活动
专区
圈层
工具
发布

分布式mysql uuid主键

基础概念

分布式MySQL中的UUID主键是一种用于唯一标识记录的标识符。UUID(Universally Unique Identifier)是一个128位的数字,通常以32个十六进制数字表示,分为5组,形式为8-4-4-4-12。UUID的生成不依赖于中央注册机构或协调,因此可以保证在全球范围内的唯一性。

优势

  1. 全局唯一性:UUID可以在不同的系统、不同的时间、不同的空间生成唯一的标识符。
  2. 无需中心协调:UUID的生成不需要中央服务器或协调机制,适合分布式系统。
  3. 安全性:UUID的随机性较高,难以预测,有助于提高系统的安全性。
  4. 扩展性:UUID的长度固定,不受数据库表结构变化的影响,便于扩展。

类型

UUID主要有以下几种版本:

  1. 版本1:基于时间戳和MAC地址生成。
  2. 版本3:基于命名空间和MD5散列生成。
  3. 版本4:完全随机生成。
  4. 版本5:基于命名空间和SHA-1散列生成。

应用场景

  1. 分布式系统:在分布式系统中,UUID可以作为唯一标识符,确保不同节点之间的数据一致性。
  2. 高并发系统:在高并发系统中,UUID可以避免自增ID可能出现的冲突问题。
  3. 数据迁移和同步:在数据迁移和同步过程中,UUID可以确保数据的唯一性和一致性。

遇到的问题及解决方法

问题1:UUID作为主键的性能问题

原因:UUID的长度较长,插入和查询时可能会影响性能。

解决方法:

  1. 索引优化:使用B-Tree索引可以提高查询效率。
  2. 分区表:将大表分区,减少单个分区的大小,提高查询效率。
  3. 缓存:使用缓存机制减少对数据库的访问次数。

问题2:UUID的可读性问题

原因:UUID的格式不易于人类阅读和理解。

解决方法:

  1. 显示格式化:在前端展示时,将UUID格式化为更易读的形式。
  2. 使用别名:在数据库中使用别名来代替UUID,提高可读性。

示例代码

以下是一个简单的示例,展示如何在MySQL中创建一个使用UUID作为主键的表:

代码语言:txt
复制
CREATE TABLE users (
    id CHAR(36) NOT NULL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

DELIMITER $$
CREATE TRIGGER before_user_insert
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.id = UUID();
END$$
DELIMITER ;

参考链接

希望以上信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为啥不能用uuid做MySQL的主键 ?

在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,...本篇博客的目录 mysql程序实例 使用uuid和自增id的索引结构对比 总结 一、mysql和程序实例 1.1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid...,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变....,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2.使用uuid的索引内部结构...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

4.8K20

为什么MySQL不推荐使用uuid作为主键?

前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用...关于MySQL的知识点总结了一个思维导图分享给大家 [1240] 一、mysql和程序实例 1.1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key...,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变....带着疑问,我们来探讨一下这个问题: 二、使用uuid和自增id的索引结构对比 2.1.使用自增id的内部结构 [1240] 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。...,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2.使用uuid的索引内部结构

6K30
  • 在MySQL中,是否可以使用UUID作为主键?

    全局唯一标识符(UUID ),是一种允许开发者生成全局唯一ID的方法,其设计确保了无需了解其他系统即可保证ID的独特性。 在分布式架构中,多个系统和数据库负责记录的创建,UUID格外有用。...在本文中,我们将详细剖析在MySQL数据库中使用UUID作为主键的弊端,在这个过程中也详细的了解一下UUID多个版本构成。 UUID 的多个版本 截至目前,UUID有五个正式版本与三个提议版本。...UUID和MySQL UUID(大多数情况下)在分布式架构中保证跨系统的唯一性,因此你可能会倾向将其用作记录的主键。然而,与自增整数相比,这样做有一些显而易见的权衡。...MySQL中使用UUID主键的最佳实践 如果确实需要在表中使用 UUID 作为记录的唯一标识符,可以遵循以下最佳实践来尽量减少负面影响: 使用二进制数据类型 虽然 UUID 经常以 36 字符长的字符串...中使用 UUID 主键在分布式系统中可以几乎确保唯一性;然而它也带来了显著的权衡。

    39710

    使用uuid做MySQL主键,被老板,爆怼一顿!

    网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件...和自增id的索引结构对比 2.1.使用自增id的内部结构 2.2.使用uuid的索引内部结构 2.3.使用自增id的缺点 三、总结 ---- 前言 在mysql中设计表的时候,mysql官方推荐不要使用...uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?...本篇博客的目录 mysql程序实例 使用uuid和自增id的索引结构对比 总结 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序...,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变.

    2.2K60

    使用uuid做MySQL主键,被老板,爆怼一顿!

    来源:cnblogs.com/wyq178/p/12548864.html 前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键...一:mysql和程序实例 1.1:要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机...*无规律*的id:一串18位长度的long值 id自动生成表: 用户uuid表 随机主键表: 1.2:光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试: 技术框架...,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2:使用uuid的索引内部结构...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

    1.6K30

    为什么MySQL不推荐使用uuid或者雪花id作为主键?

    p=5090 前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment...一、mysql和程序实例 1.1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机...用户uuid表 ? 随机主键表: ?...,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2.使用uuid的索引内部结构...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

    4.8K20

    mysql 自增id和UUID做主键性能分析,及最优方案

    UUID UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。...其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。...1.为什么要使用uuid做主键 (1).其实在innodb存储引擎下,自增长的id做主键性能已经达到了最佳。不论是存储和读取速度都是最快的,而且占的存储空间也是最小。...(2).对于InnoDB的主索引,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。...4.如果非要使用uuid做主键,下面是小建议: 如果是主从即M-S模式,最好是不使用mysql自带函数uuid来生成唯一主键,因为主表生成的uuid要再关联从表时,需要再去数据库查出这个uuid,需要多进行一次数据库交互

    9.4K20

    华为面试官:为什么MySQL不推荐使用uuid作为主键?

    1、前言 在MySQL中设计表的时候,MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用...2 MySQL和程序实例 ★ 要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key...,提升了页面的最大填充率,不会有页的浪费 新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 减少了页分裂和碎片的产生 ★ 使用uuid的索引内部结构...,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争 Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失 4 最后 在实际的开发中还是根据MySQL的官方推荐最好使用自增...id,MySQL博大精深,内部还有很多值得优化的点需要我们学习。

    2.9K20

    使用雪花id或uuid作为MySQL主键,被老板怼了一顿!

    磊哥,前几天在做项目demo的时候,使用雪花id或uuid作为Mysql主键,被老板怼了一顿!...一、MySQL和程序实例 1.1 要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机...用户uuid表 ? 随机主键表: ?...,提升了页面的最大填充率,不会有页的浪费 ②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 ③减少了页分裂和碎片的产生 2.2 使用uuid的索引内部结构...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

    10K32

    使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

    来源:cnblogs.com/wyq178/p/12548864.html ---- 前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)...,而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?...一、mysql和程序实例 1.1 要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机...减少了页分裂和碎片的产生 2.2 使用uuid的索引内部结构 因为uuid相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以innodb无法做到总是把新行插入到索引的最后...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

    1.6K20

    使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

    网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件...---- 前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment...本篇博客的目录 mysql程序实例 使用uuid和自增id的索引结构对比 总结 一、mysql和程序实例 1.1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid...,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变....用户uuid表 ? 随机主键表: ?

    2.7K10

    主键的选择:自增id?UUID?雪花算法?

    分布式环境问题:在分布式数据库系统中,自增主键可能会带来挑战。如何保证各个节点生成的自增 ID 是唯一的,这将需要额外的机制来协调各个节点。...二、UUID生成主键(32位16进制) uuid:UUID(Universally Unique Identifier,通用唯一识别码)是一种软件建构的标准,用于在分布式计算环境中为元素提供唯一的标识信息...uuid生成主键,需要将testId改成String类型  而在数据库建表的时候testId 不能用bigint了 而是用char(32)就可以了 生成的uuid是这样的 c37da8074d52022661db24bf931990af...32个字符,这个16进制写法,展开就是128比特位了 三、雪花算法生成主键(整数0 到 2^64 - 1) 雪花算法(Snowflake):是一种分布式唯一ID生成算法,用于生成全局唯一的ID...索引性能:由于UUID相对较大,使用UUID作为主键会导致索引变得更大,从而影响查询性能。特别是在执行范围查询或JOIN操作时,性能下降可能会更加明显。

    1.5K10

    使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

    前言: 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用...# mysql和程序实例 1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key...带着疑问,我们来探讨一下这个问题: # 使用uuid和自增id的索引结构对比 1.使用自增id的内部结构 自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。...,提升了页面的最大填充率,不会有页的浪费 新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗 减少了页分裂和碎片的产生 2.使用uuid的索引内部结构...在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

    2.1K10

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...: 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。

    6.7K20

    MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    8K20

    MySQL主键设计盘点

    3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql...主键的选取 【4】:路人甲Java:分布式系统生成唯一id常见方案 【5】:《MySQL必知必会》 【6】:美团技术团队:Leaf——美团点评分布式ID生成系统 【7】:UUID performance...【8】:alex.shu:MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试) 【9】:咖啡拿铁:如果再有人问你分布式ID,这篇文章丢给他 【10】:漫漫路:

    6.7K30
    领券