自增 ID 与 UUID

MySQL主键之争:自增ID VS UUID,你会如何选择? 由于自增ID是递增的整数,可以很好地支持索引,查询效率较高。自增ID的插入速度比较快,因为不需要生成一个唯一的字符串。而UUID的插入速度较慢,因为需要生成一个全局唯一的字符串。在小型单体应用中,由于数据量较小,使用自增ID可以简化开发和维护的工作。因此,选择自增ID作为主键是一个更好的选择。自增ID是指在插入数据时,数据库自动为每一条记录分配一个唯一的递增的整数值。自增ID的删除速度较快,因为只需要删除一个整数。而UUID的删除速度较慢,因为需要删除一个128位的字符串。 阅读详情

自增的主键的值是顺序的,所以 InnoDB 把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(InnoDB 默认的最大填充因子是页大小的 15/16,会留出 1/16 的空间留作以后的修改)

  1. 下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费

  2. 新插入的行一定会在原有的最大数据行下一行,MySQL 定位和寻址很快,不会为计算新行的位置而做出额外的消耗

  3. 减少了页分裂和碎片的产生

因为 UUID 相对顺序的自增 ID 来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以 InnoDB 无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。

这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下的问题:

  1. 写入的目标页很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中,InnoDB 在插入之前不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机 IO

  2. 因为写入是乱序的,InnoDB 不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上

  3. 由于频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片

在把随机值(UUID 和雪花 ID)载入到聚簇索引(InnoDB 默认的索引类型)以后,有时候会需要做一次 OPTIMEIZE TABLE 来重建表并优化页的填充,这将又需要一定的时间消耗。

结论:使用 InnoDB 应该尽可能的按主键的自增顺序插入,并且尽可能使用单调的增加的聚簇键的值来插入新行

那么使用自增的id就完全没有坏处了吗?并不是,自增 ID 也会存在以下几点问题:

  1. 别人一旦爬取你的数据库,就可以根据数据库的自增 ID 获取到你的业务增长信息,很容易分析出你的经营情况

  2. 对于高并发的负载,InnoDB 在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争

  3. Auto_Increment 锁机制会造成自增锁的抢夺,有一定的性能损失

附:Auto_Increment 的锁争抢问题,如果要改善需要调优 innodb_autoinc_lock_mode 的配置

uuid和自增id游戏 1.2.光有理论不行,直接上程序,使用spring的jdbcTemplate来实现增查测试: 技术框架:springboot+jdbcTemplate+junit+hutool,程序的原理就是连接自己的测试数据库,然后在相同的环境下写入同等数量的数据,来分析一下insert插入的时间来进行综合其效率,为了做到最真实的效果,所有的数据采用随机生成,比如名字、邮箱、地址都是随机生成。 `package com.wyq.mysqldemo; import cn.hutool.core.collection.Col 阅读详情

相关推荐

Python ID 生成(UUID、自增、19位雪花算法ID)

UUID UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来作为主键,原理上它是可以对任何东西进行唯一的编码的。 import uuid name = "Li" namespace = "Frank" ''' 基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性。 ''' print(uuid.uuid1()) ''' 算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID

心有猛虎细嗅蔷薇 1万+

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

在 MySQL 中设计表的时候,MySQL 官方推荐不要使用 uuid 或者不连续不重复的雪花 id(long 形且唯一,单机递增),而是推荐连续自增的主键 id,官方的推荐是 auto_increment。 一、对比: user_auto_key 自动增长的主键 user_uuid uuid 作为主键 user_random_key 随机 key 作为主键 在已有数据量为 130W 的时候...

沐雨金鳞 760

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7647

Mybatis Day2:自增ID、UUID、雪花ID

当数据非常大的时候会进行分库分表, 此时自增的 id 会带来业务上的问题(不同的表会产生相同的 id 值) 因此可以考虑使用雪花 id,生成雪花 id 可以使用开源的工具类生成,(例如:hutool) 雪花 id 是一个长度 64 位的 long 类型的 id。如果是小项目可以考虑使用自增id,中大型以上的项目就可以使用 UUID 和 雪花ID。

zhiqiuqiu2的博客 5255

AI大模型API中转站选型指南:12项关键指标与实战评估

随着AI大模型技术的快速迭代,企业面临着一个核心挑战:如何在基础模型频繁更新的背景下,为业务系统选择稳定可靠的API中转服务?本文基于真实生产环境测试数据,从12个关键维度系统评估主流API中转站平台,帮助技术团队在模型快速演进的生态中做出科学选型决策。 1. API中转站的核心价值与业务场景 1.1 什么是API中转站 API中转站(API Gateway/Aggregator)是连接业务系统与多个大模型厂商的中间层服务。它通过统一的接口封装了不同厂商的API协议差异,为企业提供标准化的模型调用能力。在实

weixin_29056101的博客 448

视觉开发板—K210自学笔记(三)--点亮LED

K210点亮LED灯

adamsecond 3412

Mysql 自增id、uuid与雪花id 以及 自增id和业务id如何抉择

自增iduuidUUID是UniversallyUniqueIdentifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。通用唯一标识符的意思,可以以业务实际userid为主键比如QQ号手机号等雪花id相比UUID无序生成的id而言,雪花算法是有序的(有时间参数),而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位。适用于大规模分布式。.........

S_ZaiJiangHu的博客 1万+

华为OD机试新系统真题 【LLM推理批次最大化】

华为OD机试 新系统真题【LLM推理批次最大化】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【LLM推理批次最大化】多语言题解。

qq_45776114的博客 573

C# 分布式自增ID算法snowflake(雪花算法)

分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而Twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。

Aiken的自由世界 3021

【深度学习驱动流体力学】Python流体力学Ansys Fluent

PyFluent 是一个将 Python 编程语言与 Ansys Fluent 流体动力学 (CFD) 仿真软件集成的工具。它允许用户通过 Python 脚本来控制和自动化 Fluent 中的仿真任务,实现从预处理、求解到后处理的全流程控制。PyFluent 结合了 Python 的灵活性和 Fluent 的强大功能,提供了一种高效且灵活的 CFD 仿真方法。PyFluent 是一个强大而灵活的工具,使用户能够通过 Python 脚本全面利用 Ansys Fluent 的功能。

源代码杀手的博客 3125

深入理解SQL注入中的union select 1,2,3....

UNION 用于合并两个查询的结果集

渗透之路,攻防之间皆学问 2万+

自增还是UUID,数据库主键的类型该如何选择?

自增还是UUID? 数据库主键的类型该如何选择?

白白白鲤鱼的博客 2319

rk3588主板PDM接口接数字MIC录音

本文介绍了Rockchip 3588平台上6麦克风PDM接口的硬件连接与软件调试过程。硬件方面展示了PDM0_CLK0_M0时钟脚和三组数据脚的连接方案。软件配置包括设备树修改,生成声卡节点,并提供了6通道录音命令示例。文章重点分析了两个常见问题:录音无声(需检查供电、接线和波形)和通道数据缺失(需正确配置rockchip,path-map寄存器映射)。最后通过Audition工具验证录音文件,确认各通道工作正常。调试过程完整展现了从硬件连接到软件配置的完整流程。

m0_60805802的博客 1015

uuid与自增id的区别与使用

最近在使用数据库要建表选择主键的时候,突然想到经常使用的两类主键id——自增id和UUID有什么区别,用那种更好?之前使用MySql的时候通常直接就选择了自增id了,工作的时候也看到有些项目使用UUID做主键,但是都没怎么考虑两者的区别,优缺点之类的。现在要键新表选择主键的时候,就需要考虑选择哪种做主键了,因此就有了这篇文章 本文首先分别简单为什么数据库需要主键,然后介绍自增id和UUID,接着比较两者的区别,最后给出何时使用哪种类型做主键更好。 关系型数据库中的主键 在关系型数据库模型中,关系型数据库是一

8805

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

mysql自增id与uuid的区别

前言 在设计数据库表的时候,MySQL官方推荐不要使用uuid或者不重复不连续的雪花id(long型且id唯一,单机递增),而是腿甲使用自增id,推荐使用auto_increment。 自增id

heromps的博客 2037

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

详解:MySQL自增ID与UUID的优缺点及选择建议,MySQL有序uuid与自定义函数实现

自增ID的优缺点,不适合以自增ID主键作为主键的情况,UUID介绍说明,uuid是什么,uuid的组成,UUID作为主键优缺点,mysql8.0的uuid_to_bin()函数分析及实现,mysql有序UUID实战,自定义uuid,自增id主键与自定义主键的选择建议,JDBCUtilsByDruid工具类,mysql数据类型binary,mysql函数hex(),mysql函数unhex(),bin_to_binary(uuid(),true)详细说明与实战/示例演示,什么是uuid

是谢添啊 1万+

自增ID,UUID,雪花ID的使用

主键ID主要有: 数据库自增主键 uuid 雪花ID 数据库的自增主键: 从大学做实验开始就一直用自增主键,以前也没考虑过用自增主键有啥问题,直到工作后… (1)首先自增主键不适用于分库分表情况,在做数据集合的时候会出现主键重复问题,做多个系统的数据汇总也会有冲突 (2)其次,详情…删除…查询…这些接口如果都是依赖着自增主键做操作,很容易有安全性问题(这是测试同学做渗透测试的时候告诉我的),同时很容易造成越权(掌握你自增主键的规律然后一定程度上越过某些校验获取数据) 所以以后再给我好好设计数据库的话,我都不

whiteBearClimb的博客 3185

自增、UUID、雪花算法ID对比

ID算法

polarrwl的专栏 5802

使用自增ID主键和UUID作为主键的优劣比较

mysql不要用uuid用自增主键,自增主键效率高innodb的索引特性导致了自增id做主键是效率最好的 测试: 1、准备表以及数据 UC_USER,自增ID为主键,表结构类似如下: CREATE TABLE `UC_USER` (  `ID` bigint(20) NOT NULL AUTO_INCREMEN...

Buns.的博客 7627

Mysql 自增id、uuid与雪花id

自增id :1 2 3 4 5……uuid :UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。通用唯一标识符的意思,可以以业务实际user id为主键 比如QQ号 手机号等雪花id :相比UUID无序生成的id而言,雪花算法是有序的(有时间参数),而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位。适用于大规模分布式1、旧系统或者单部署系统,一般都采用自增主键,主要是便捷性考虑。

一直在水些技术小文 2670

MySql 主键一般用自增ID还是UUID

14、主键一般用自增ID还是UUID? (1)自增ID: 使用自增ID的好处: 字段长度较 UUID 会小很多。 数据库自动编号,按顺序存放,利于检索 无需担心主键重复问题 使用自增ID的缺点: 因为是自增,在某些业务场景下,容易被其他人查到业务量。 发生数据迁移时,或者表合并时会非常麻烦 在高并发的场景下,竞争自增锁会降低数据库的吞吐能力 (2)UUID:通用唯一标识码,UUID是基于当前时间、计数器和硬件标识等数据计算生成的。 使用UUID的优点: 唯一标识,不用考虑重复问题,在数据拆分

书香水墨 5246

MySQL:关于ID的选择问题,自增/UUID/雪花ID

这么看来雪花算法好像是比较全面的,但是有一个最大的问题就是时钟回拨的问题。百度的生成器里面,已经解决了这个问题。

人在江湖 3644

【MySQL】关于自增id、雪花id还是uuid作为MySQL主键

在MySQL中设计表的时候,MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long型且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment。那么为什么不使用雪花id或者uuid呢?让我们来探讨分析一下这个问题的原因。

A-Itfuture的博客 1714

(自用)自增 ID、雪花 ID、UUID 的定义及优缺点对比

伸缩性:自增不支持,雪花、UUID支持。占用空间:自增 < 雪花 < UUID。检索效率:自增 < 雪花 < UUID。

wdsl666的博客 1800

MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?

前言 在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment),那么为什么会这样建议呢,我们来简单地分析一下。 背景 随着现在许多项目都涉及到了分布式或者微服务,后续或多或少都会针对具体的服务需求对数据库进行拆分(分库分表),这里就会产生一个问题,拆分后的 id 该如何妥善处理? 例如,在之前的业务中,所有的数据内容都是存放在同一张数据表中的,主键 id 都是自增的,这当然没有任何问题。但是当单表的数据量上

小楠的博客 9538
上一篇: 分布式集群架构场景化解决⽅案
下一篇: 阶段一模块一
LiveForCode
博客等级 码龄5年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值