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

news2024/11/24 17:40:52

一、自增(auto_increment)和UUID优缺点

自增 (auto_increment)的优点:
1.字段长度较uuid小很多,可以是bigint甚至是int类型,这对检索的性能会有所影响。
2.在写的方面,因为是自增的,所以主键是趋势自增的,也就是说新增的数据永远在后面,这点对于性能有很大的提升。


3.数据库自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利。
4.数字型,占用空间小,易排序,在程序中传递也方便。

自增 (auto_increment)的缺点:
1.由于是自增,很容易通过网络爬虫知晓当前系统的业务量。
2.高并发的情况下,竞争自增锁会降低数据库的吞吐能力。
3.数据迁移或分库分表场景下,自增方式不再适用。

UUID的优点:
1.不会冲突。进行数据拆分、合并存储的时候,能保证主键全局的唯一性。
2.可以在应用层生成,提高数据库吞吐能力。

UUID的缺点:
1.影响插入速度,并且造成硬盘使用丰低。与自增相比,最大的缺陷就是随机IO (新的记录可能会插入之前记录的中间,因此需要移动之前的记录)


2.字符串类型相比整数类型肯定更消耗空间,而且会比整数类型操作慢。

二、具体选择

选择数据库主键的类型要根据具体的需求来决定,以下是自增和UUID两种主键类型的比较:

  1. 自增主键:每次插入一条新记录时,数据库会自动为该记录分配一个唯一的自增值。自增主键通常使用整数类型,如INT或BIGINT。自增主键的优点是简单、高效,插入速度快,且查询效率较高。它适用于大多数情况下,特别是在需要频繁插入新记录的场景。

  2. UUID主键:UUID(Universally Unique Identifier)是一种全球唯一的标识符。它是一个128位的数字,通常以字符串形式表示。UUID主键的优点是在分布式系统中可以保持唯一性,不同数据库之间也不会冲突。它适用于需要在多个数据库之间同步数据或者需要将数据标识与业务逻辑解耦的场景。

选择自增主键还是UUID主键,要考虑以下因素:

  • 数据库性能: 自增主键往往比UUID主键的查询效率更高,对于大规模数据集更为适用。
  • 数据复制和合并: 如果需要将数据从不同的数据库合并或同步,使用UUID主键可以避免冲突。
  • 安全性和隐私: 如果需要保护数据的安全性或隐私,可以考虑使用UUID主键,因为自增主键可能会暴露数据的插入顺序和数量信息。

       因为uuid 相对顺序的自增id来说是毫无规律可言,新行的值不一定要比之前主键的值要大,所以InnoDB无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下问题:
①.写入的目标页很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中InnoDB在插入之前不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机IO。
②.因为写入是乱序的,innodb不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上。

③.由于频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片。
④.在把随机值(uuid 和雪花id)载入到聚簇索引(InnoDB默认的索引类型)以后,有时候会需要做一次
OPTIMEIZE TABLE来重建表并优化页的填充,这将又需要一定的时间消耗。


        结论:使用 InnoDB应该尽可能的按主键的自增顺序插入,并且尽可能使用单调的增加的聚簇键的值来插入新行。如果是分库分表场景下,分布式主键ID的生成方案优先选择雪花算法生成全局唯一主键(雪花算法生成的主键在一定程度上是有序的)。因此,对于大多数情况下,使用自增主键是一个较为常见和合理的选择。但如果需要在分布式系统中使用,或有特定的安全性或隐私需求,则可以考虑使用UUID主键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小游戏外包开发流程及费用

小游戏的开发流程和费用会因项目的规模、复杂性和所选技术平台而有所不同。以下是一般的小游戏开发流程和可能的费用因素,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 开发流程: 概念和…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中,没有Assemble任务 1. 在编译aar包或者编译module的时候,没有release包,我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …

TransactionScope的使用

TransactionScope的使用 简介1. 命名空间2.创建事务范围3.嵌套事务4.事务提交和回滚5.支持分布式事务6.配置选项7.资源管理器8.分布式事务协调器 应用1.未设置分布式事务2.设置分布式事务 简介 TransactionScope 是 .NET Framework 和 .NET Core 中的一个类,用于简化…

Java数组—精讲篇

Java数组—精讲篇 先进行专栏介绍 二维数组定义格式初始化静态初始化动态初始化 举例声明并初始化一个3行4列的整型二维数组访问二维数组元素访问二维数组array中第2行第3列的元素 遍历二维数组遍历二维数组array并打印每个元素的值强调 应用举例总结 程序展示二维数组元素打乱…

ThingsBoard的版本控制整合gitee

1、注册gitee账号,创建自己的空间,并且创建一个用于存储ThingsBoard相关的仓库 2、进入ThingsBoard的租户层,然后找到版本控制,进行配置 输入gitee的仓库地址 仓库URL:指定你的gitee的参考地址 仓库分支:master 身份验证:密码、访问令牌 用户名:登录账号 密码/访问令…

【LeetCode刷题】1两数之和

为找工作,我的代码都是用的JAVA,慢慢学习中。 LeetCode刷题Day1 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入…

【干货】Java函数式编程公式大全,收藏学习!

函数操作是现代编程领域中的核心概念之一,它以类似 Excel 表格的方式进行数据处理和计算。它的特点是使用公式和函数来描述数据之间的关系和计算逻辑;它允许我们以更高效、更有组织的方式管理和处理数据。 在函数式编程中,数据被组织成表格的…

UDP网络通信反复发收

package UDP2;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/* * 完成UDP 通信快速入门 实现发1收1*/ public class Client {public static void main(String[] args) throws Exception{// …

统信操作系统UOS上安装arm64版nginx

原文链接:统信操作系统UOS上安装arm64版nginx hello,大家好啊,今天给大家带来一篇在统信桌面操作系统UOS上安装arm64版nginx的文章,本篇文章主要是给大家提供一种下载离线nginx软件包的方法,拿到软件包可以去不能链接互…

Qt耗时操作添加动画等待加载效果

Qt耗时操作添加动画等待加载效果_qt 等待动画-CSDN博客本例模拟耗时请求实现动画等待加载效果,采用QtConcurrent::run实现异步耗时操作,通过QFutureWatcher异步监测耗时操作结果的返回值做相应的动画演示。_qt 等待动画https://blog.csdn.net/qq_3666686…

解决AndroidStudio Gradle只有testDebugUnitTest

问题复现: 问题解决: 1:点击Task list not built... 2:取消勾选Configure all Gradle tasks during Gradle Sync... 大功告成,现在去看看Gradle,屏蔽的都显示出来了。

CUDA学习笔记(九)Dynamic Parallelism

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 Dynamic Parallelism 到目前为止,所有kernel都是在host端调用,CUDA Dynamic Parallelism允许GPU kernel在device端创建调用。Dynamic Parallelism使递归更容易实现…

信钰证券:长江电力180亿市值,招商证券、摩根大通等浮盈超一成

本周A股限售股解禁规划环比有所上升。 Wind数据核算闪现,除去新上市公司,本周共有64家公司限售股解禁,解禁数量51.52亿股,以最新收盘价核算(下同),解禁市值776.21亿元。 本周解禁市值跨越10亿…

C++二分算法的应用:寻找峰值原理、源码及测试用例

说明 此文是课程https://edu.csdn.net/course/detail/38771 的讲义。 源码下载:https://download.csdn.net/download/he_zhidan/88458478 题目 长度为n的数组nums,请返回任意一峰值的索引。符合以下条件之一i便是峰值的索引。 n等于1 i等于0 n>…

构建并训练单层神经网络模型

1. 单层神经网络 单层神经网络由一个层次中的多个神经元组成,总体来看,单层神经网络的结构是:一个输入层,一个隐含层,一个输出层。 图中描述的是前向网络,但其反向传播网络的结构也是一样的。蓝色方框表示输入层,绿色圆圈表示隐含层,输出层没有绘制出来。 1.1 加载…

Linux安装Redis(这里使用Redis6,其它版本类似)

目录 一、选择需要安装的Redis版本二、下载并解压Redis三、编译安装Redis四、启动Redis4.1、修改配置文件4.2、启动 五、测试连接5.1、本地连接使用自带客户端redis-cli连接操作redis5.2、外部连接使用RedisDesktopManager操作redis 六、关闭Redis七、删除Redis 一、选择需要安…

【吞噬星空】战神宫全体投票,为罗峰脱罪,徐欣补办婚礼,洪成功恢复脑电波

【侵权联系删除】【文/郑尔巴金】 吞噬星空动画第90集即将更新,官方相当给力,提前曝光了图文情报与先行预告。虽然罗峰与巴巴塔尚未正式开始闯荡宇宙,但却是斩杀阿特金三大巨头的平稳生活。不但有战神宫为罗峰脱罪,而且还给徐欣补…

python如何创建自己的对冲交易算法

在这篇文章中,我解释了如何创建一个人工智能来每天为我进行自动交易。 随着机器学习的现代进步和在线数据的轻松访问,参与量化交易变得前所未有的容易。为了让事情变得更好,AWS 等云工具可以轻松地将交易想法转化为真正的、功能齐全的交易机器…

重组件的优化和页面渲染十万条数据

重组件的优化和页面渲染十万条数据的优化 重组件的优化vue2写法vue3写法 页面渲染十万条数据的优化使用虚拟列表的方式 重组件的优化 以下代码原理是使用requestAnimationFrame(callback) 方法 vue2写法 Test01.vue <template><div class"container">&…

第十届山东省大学生网络安全技能大赛【神秘的base】【小试牛刀】

神秘的base 题目描述 EvAzEwo6E9RO4qSAHq42E9KvEv5zHDt34GtdHGJaHD7NHG42bwd神奇密码&#xff1a; xbQTZqjN8ERuwlzVfUIrPkeHd******LK697o2pSsGDncgm3CBh/Xy1MF4JAWta解题思路 这个题&#xff0c;上午一直零解&#xff0c;后来放出了hint&#xff0c;提示了base64换表。 这…