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

mysql 生成全局唯一键

基础概念

MySQL中的全局唯一键(Global Unique Key,简称GUID)是一种用于确保数据库表中每一行数据具有唯一标识的约束。全局唯一键通常通过使用UUID(Universally Unique Identifier)来生成,这是一种由32个十六进制数字组成的标识符,能够保证在全球范围内的唯一性。

相关优势

  1. 唯一性保证:全局唯一键能够确保表中的每一行数据都有一个独一无二的标识符。
  2. 分布式系统友好:UUID作为全局唯一键,在分布式系统中特别有用,因为它不依赖于中央协调器来生成唯一标识符。
  3. 避免ID泄露:与自增ID相比,UUID不会暴露数据的生成顺序和数量,有助于保护数据隐私。

类型与应用场景

  • UUID:最常用的全局唯一键类型,适用于需要跨多个系统或数据库实例保持唯一性的场景。
  • Snowflake ID:由Twitter提出的一种分布式ID生成算法,适用于高并发、大数据量的场景。

遇到的问题及解决方法

问题:为什么使用UUID作为全局唯一键会导致性能下降?

原因:UUID是无序的,当作为主键插入数据时,会导致数据库索引的碎片化,从而影响查询性能。

解决方法:

  1. 使用有序的全局唯一键:如Snowflake ID,它生成的ID是有序的,可以减少索引碎片化。
  2. 优化索引:定期对数据库索引进行重建,以减少碎片化的影响。
  3. 分区表:将大表分区,每个分区使用独立的全局唯一键,可以减少单个索引的大小,提高查询性能。

示例代码

以下是一个在MySQL中创建表并使用UUID作为全局唯一键的示例:

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

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

参考链接

通过以上信息,您可以更好地理解MySQL中全局唯一键的概念、优势、类型及应用场景,并解决在使用过程中可能遇到的问题。

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

相关·内容

全局id如何生成?

很多时候我们都需要生成一个全局id用于数据存储的主键,那么如何生成一个全局id呢?有哪些方法?优缺点是啥?...1.数据库自增id 我们需要一个单独的表给我们专门生成自增id,每次到这个专门生成id的表里插入一条数据拿回id,带着这个id去新增自己分表数据; 优点:方便简单,谁都会用; 缺点: 1.单库生成自增...适合的场景:如果你是要随机生成个什么文件名了,编号之类的,你可以用uuid,但是作为主键是不能用uuid的。...你可以将别的业务字段值跟当前时间拼接起来,组成一个全局唯一的编号,订单编号,时间戳 + 用户id + 业务含义编码 4.snowflake算法 twitter开源的分布式id生成算法,就是把一个64位的...因为二进制里第一个bit为如果是1,那么都是负数,但是我们生成的id都是正数,所以第一个bit统一都是0 41 bit:表示的是时间戳,单位是毫秒。

2.2K50
  • MySQL 定义变量 – 局部 – 全局

    本页目录 定义一个局部变量(会这个就够了) 定义全局变量(了解即可) 定义一个局部变量(会这个就够了) 方式:set @变量名 注意哦:这个局部变量是Session回话级别的,关闭本次回话,也就是在你Navicat...where charid = @charId; 定义全局变量(了解即可) 注意哦:全局变量变量名不允许随便设置。...必须是MySQL系统能够识别的变量名称才可以,比如:slow_query_log。...还有一点,设置的内容,重启MySQL后,就会恢复成配置文件的设置内容,如果要永久生效,记得在MySQL配置文件中设置哦!!!...写法2 推荐 -- 设置系统全局慢日志开启 set global slow_query_log = 'ON'; -- 查看系统全局慢日志相关字段信息 show variables like 'slow_query

    3.6K40

    常见的全局ID生成方案

    在分布式系统架构中,经常都需要一个全局的ID生成器,来保证系统中某些业务场景中对于主键的要求,当前实现ID生成的方式还是挺多的。本文我们来谈谈常见的ID生成方式。...全局ID该有的特性 唯一性: 确保生成的ID为全网唯一 有序性: 确保ID对于某项业务来说是有序性递增的 时间戳: 可清楚知道ID生成的时间点 高可用性: 确保任何时间都能生成有效ID 常见的ID生成方式...数据库自增 mysql数据库使用auto_increment 字段来辅助为ID自增。 oracle数据库通过创建sequence 来生成ID自增。...Redis实现全局ID生成器 定义一个通用的key,该key的规则是时间格式,精确到秒,保证每秒都是不同的key(当然key的规则可以根据自身业务需求进行定制),value的值是一个long型的整数,前半部分是当前时间精确到秒....”Leaf具备高可靠、低延迟、全局唯一等特点。

    1.7K20

    如何生成全局唯一标识

    引出 大家都用过QQ或者微信吧, 当我们注册的时候, 会被自动分配一个QQ号, 这个号码是全局唯一且固定的, 那么, 如果是你来写的话, 如何为新注册的用户分配一个号码呢?...MySQL主键自增, 或者redis记一个key, 每次incr自增. 什么? QQ号从1开始太丑了? 简单, 自增设置一个起始ID. 完美, 实现方案简单粗暴, 而且不会出现重复....方案三 说起来, 要生成这样的随机ID, 总要有一个地方来记录已生成的进度, 如果完全随机生成的话, 就不可避免的需要回查是否存在. 记录生成进度的可以有很多: redis、MySQL等等....或者可以存在一个发号器, 所有的ID都有它来生成, 不停的生成, 供其他请求分配使用, 就是一个生产者消费者. 小结 通过想了几种方案, 发现了一些规律....很好, 那么现在问题就归结为, 如何给每个用户都配一个唯一标识 1.数数 直接想到的方案, 从1开始, 慢慢往后数, 而这个过程可以借助MySQL的主键自增, 也可以借助redis的单线程优势.

    2.4K20

    snowflake升级版全局id生成

    背景 分布式系统或者微服务架构基本都采用了分库分表的设计,全局唯一id生成的需求变得很迫切。 传统的单体应用,使用单库,数据库中自增id可以很方便实现。...1.全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。...2.2 数据库生成 以MySQL举例,利用给字段设置 auto_increment_increment和 auto_increment_offset来保证ID自增,每次业务使用下列SQL读写MySQL得到...另一种情况是,server服务启动时,系统的时间被回拨(虽然比较极端,还是列在考虑中),这样有可能与之前生成的id冲突,全局不唯一。...总结 这篇文章和大家分享了笔者项目中全局id生成服务的演进过程。

    2K110

    全局id生成器试用之Leaf

    但是分库分表后,主键id就不能依赖于MySQL,需要从外部去获取id。...目前我们生产环境在用的DBLE作为中分库分表中间件, 其自带了类似snowflake方案的全局id生成器,也可以基于数据库来实现。...但是,在一个大点的公司里面, 全局id 是一个用处很广泛的服务,通常会独立作为一个公共服务对外提供。 这里我们就以美团点评出的 Leaf为例,看下它的效果。...//192.168.20.10:8080/api/segment/get/tid 5 其它 号段模式自带了个监控界面:    http://192.168.20.10:8080/cache 测试id的生成效果...只要我们的MySQL数据库故障切换的时候不要太久,并且配合设置不同biz_tag以不同大小的step,通不会对对leaf服务造成影响。 下面是双buffer在web界面上的体现: ?

    1.7K50

    分布式全局ID生成方案

    这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。...对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能,可以查阅 Mysql 索引原理 B+树的知识。...以MySQL举例,利用给字段设置 auto_increment_increment和 auto_increment_offset来保证ID自增。...还有就是ID发号性能瓶颈限制在单台MySQL的读写性能。...Redis 实现分布式全局唯一ID,它的性能比较高,生成的数据是有序的,对排序业务有利,但是同样它依赖于redis,需要系统引进redis组件,增加了系统的配置复杂性。

    1.9K10

    MySQL Cases-MySQL找出谁持有全局读锁

    /developer/article/1869793 MySQL找出谁持有行锁(RC级别)https://cloud.tencent.com/developer/article/1869900 找出谁持有全局读锁...在MySQL5.7之前的版本中,要排查谁持有全局读锁,通常在数据库层面是很难直接查询到有用数据的(innodb_locks表也只能记录InnoDB层面的锁信息,而全局读锁是Server层面的锁,所以无法查询到...从MySQL5.7版本开始提供了performance_schema.metadata_locks表,用来记录一些Server层的锁信息(包含全局读锁和MDL锁等)。...下面通过一个示例来演示如何使用performance_schema找出谁持有全局读锁。...作者:姚崇 Oracle OCM、MySQL OCP、Oceanbase OBCA、PingCAP PCTA认证,擅长基于Oracle、MySQL Performance Turning及多种关系型 NoSQL

    1.6K61

    MYSQL的全局锁和表锁

    什么是mysql的锁数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。...根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。...全局锁顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。...全局锁的典型使用场景是,做全库逻辑备份。 也就是把整库每个表都select出来存成文本。以前有一种做法,是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。...在MySQL的information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。

    1.2K10

    Unity TextMeshPro 一键生成工具

    .批量查找游戏中Canvas或其他GameObject上的文字内容 2.扫描查找指定路径下的配置文件中文本内容 3.将这些文本去除重复字符后保存到一个固定的输出路径 4.根据输出的游戏文本内容按照想要生成的...TMP字体类型批量一键生产和更新 5.随时批量修改Canvas上的字体资源 下面是一些相对具体的思路: 查找Canvas中的文字资源很简单,只需要遍历所有的对应组件上的内容就行了: 1 string newText...在Updata()中检测上一个字体资源的生成进度,按百分比显示,当生成完成时循环生成下一个即可: 1 private void MyUpdate() 2 { 3 if (m_IsRepaintNeeded...m_AtlasGenerationProgress * 100; 14 15 m_IsRepaintNeeded = true; 16 } 17 18 // 是否生成完..., "OK"); 8 return; 9 } 10 11 //判断资源信息的生成开关是否已经开启 12 var info = m_FontAssetInfos

    2.6K10
    领券