MYSQL中GUID和自增列做主键的优缺点

从仿真到实物:Realsense D435+ROS2焊接机械臂的视觉标定与数据验证指南 本文详细介绍了如何将Realsense D435相机与ROS2焊接机械臂从仿真环境迁移到实物部署的全过程。通过视觉标定、数据验证和焊接场景优化,确保系统在真实环境中精准可靠。重点讲解了硬件配置、驱动优化、数据一致性验证及焊接应用的特殊处理,为工业自动化开发者提供实用指南。 阅读详情

1.什么是GUID?

UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

UUID格式:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)

GUID格式:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)

注:x代表0-9或a-f范围内的一个十六进制的数字。

1.SQL Server数据库
以前开发SQL Server数据库将表定义中将列类型指定为uniqueidentifier,则列的值就为 GUID 类型。

2.使用T-SQL生产一个GUID
insert into table1(id,name,...) values(NewID(),'张三',...)

3.在C#中创建一个GUID
Guid guid = Guid.NewGuid();
Console.Writeln(guid.ToString());

4.在Java中创建UUID
在Java中,是UUID。创建方式String ReqUUID = UUID.randomUUID().toString();
————————————————————————————————————————————————————

 

2.SQL GUID和自增列做主键的优缺点

公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键。所以呢,这里总结一下,将两种数据类型做主键进行一个比较。

主键自增为什么比随机和自定义快?
1、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
2、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。


使用INT做主键的优点:
1、需要很小的数据存储空间,仅仅需要4 byte 。
2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。
3、index和Join 操作,int的性能最好。
4、容易记忆。
5、支持通过函数获取最新的值,如:Scope_Indentity() 。
使用INT做主键的缺点
1、如果经常有合并表的操作,就可能会出现主键重复的情况。
2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。
(Int 4B,存储-231~231-1范围的整数;2147483647 / 1000 / 365 = 5883.516841095890410958904109589
差不多可以用 6000年,就算10000条记录,也可以用 500多年)
3、很难处理分布式存储的数据表。


为什么要使用guid做主键
(1).其实在innodb存储引擎下,自增长的id做主键性能已经达到了最佳。不论是存储和读取速度都是最快的,而且占的存储空间也是最小。
(2).但是在我们实际到项目中会碰到问题,历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id一定会有冲突,但如果各自的id还关联了其他表,这就很不好操作。
(3).如果使用UUID,生成的ID不仅是表独立的,而且是库独立的。对以后的数据操作很有好处,可以说一劳永逸。

使用GUID做主键的优点:
1、它是独一无二的。
2、出现重复的机会少。
3、适合大量数据中的插入和更新操作。
4、跨服务器数据合并非常方便。
使用GUID做主键的缺点:
1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。 如果你建的索引越多, 影响越严重。
2、很难记忆。join操作性能比int要低。
3、没有内置的函数获取最新产生的guid主键。
4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能,影响插入速度。
5、GUID之间比较大小相对数字慢不少, 影响查询速度


最优方案
(1).InnoDB引擎表是基于B+树的索引组织表。
(2).B+树:B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
(3).InnoDB主索引:叶节点包含了完整的数据记录。这种索引叫做聚集索引。InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引
(4).聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

总结:
(1).如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的。为了存储和查询性能应该使用自增长id做主键。

(2).对于InnoDB的主索引,数据会按照主键进行排序,由于GUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用GUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。为了全局的唯一性,应该用guid做索引关联其他表或做外键。

如果非要使用uuid做主键,下面是小建议:
如果是主从即M-S模式,最好是不使用自带函数guid来生成唯一主键,因为主表生成的guid要再关联从表时,需要再去数据库查出这个guid,需要多进行一次数据库交互,而且在这个时间差里面主表很有可能还有数据生成,这样就很容易导致关联的guid出错。如果真要使用guid,可以在Java中生成后,直接存储到DB里,这时主从的guid就是一样的了!

-----------------------------------------------------------------------------------------------------------------------------------

GUID 的优缺点 uniqueidentifier

1) 优点

  • 同 IDENTITY 列相比,uniqueidentifier 列可以通过 NewID() 函数提前得知新增加的行 ID,为应用程序的后续处理提供了很大方便。
     
  • 便于数据库移植,其它数据库中并不一定具有 IDENTITY 列,而 Guid 列可以作为字符型列转换到其它数据库中,同时将应用程序中产生的 GUID 值存入数据库,它不会对原有数据带来影响。
     
  • 便于数据库初始化,如果应用程序要加载一些初始数据, IDENTITY 列的处理方式就比较麻烦,而 uniqueidentifier 列则无需任何处理,直接用 T-SQL 加载即可。
     
  • 便于对某些对象或常量进行永久标识,如类的 ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义等。

2) 缺点

    • GUID 值较长,不容易记忆和输入,而且这个值是随机、无顺序的,所以使用时要注意场合,最好不要尝试用它来作为你的电子邮件地址 J
       
    • GUID 的值有 16 个字节,与其它那些诸如 4 字节的整数相比要相对大一些。这意味着如果在数据库中使用 uniqueidentifier 键,可能会带来两方面的消极影响:存储空间增大;索引时间较慢。
基于深度学习的CT图像肺结节分割与检测系统[完整代码数据分享] 阅读详情

相关推荐

【文献阅读:信道估计】Deep Residual Learning Meets OFDM Channel Estimation

基于深度学习的信道估计技术

weixin_43178683的博客 1753

mysql里面guid_数据库中GUID的生成

GUID, 即Globally Unique Identifier(全球唯一标识符) 也称作UUID(Universally Unique IDentifier) 。 GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 广泛应用于微软的产...

weixin_31460419的博客 2万+

国产大模型编程能力深度分析报告(2026年5月更新版)

2026年5月国产大模型编程能力报告显示,主流模型迎来重大升级。DeepSeek V4以1.6T参数创性能新高,Qwen3.6-Plus支持原生多模态编程,MiniMax M2.7转向闭源并优化Agent编码,Kimi K2.6成为商业化成熟的主力模型,GLM-5开源并涨价30%。阿里云百炼推出双轨订阅体系,区分团队和个人开发者需求。各模型在参数规模、上下文长度、性能表现和适用场景上各具优势,国产AI编程服务正加速向订阅制转型,成本效益显著提升。

Willin Wang 的全栈升级指南 1640

Mysql 为现有数据生成Guid

GUID 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。所以,用于生成GUI...

xingkongvv12的博客 1706

ctftools-all-in-one使用说明

OAEP (Optimal Asymmetric Encryption Padding) 是一种用于RSA加密的填充方案,目的是提高RSA加密的安全性。在CTF比赛中,如果模数N的两个因子比较接近,使用"费马分解(N)"可能会更快地得到结果;OAEP 是 RSA 的一种标准填充方式(在 PKCS#1 v2.0+ 中定义),因此这类题目本质上仍是 RSA 题,但。,导致你不能直接用常规的 RSA 解密公式 �=�� mod �m=cdmodN 得到有意义的明文。如果你在 CTF 中遇到 RSA 题,

2501_91682449的博客 1712

锂电池SOH估计 | 基于LSTM模型的锂电池SOH估计(Python)

锂电池SOH估计 | 基于LSTM模型的锂电池SOH估计(Python)

前程算法屋的博客 1432

mysql 有没guid类型_可遇不可求的Question之MySqlClient的Guid 类型的映射篇

关于 Guid 类型的映射MySql 没有原生的 Guid 类型,一般使用 binary(16) 或者 char(36) 这两个类型。早期版本的 Connector/Net 将 binary(16) 自动映射成为 Guid 类型。从 Connector/Net 6.1.1 开始,binary(16) 不再被自动映射成为 Guid 类型,而选用 char(36)。通过连接字符串的 Old Guids...

weixin_39790504的博客 865

详解【异质图卷积网络 RGCN】回顾:图神经网络问题的三大处理步骤 | 从起源说起,RGCN核心公式解释,两种降低模型参数量/优化的方式,附核心代码实现讲解

本篇,我们深入分析和学习RGCN的原理以及为何要这么做。首先让我们来回顾对于图神经网络问题的三大处理步骤,可以说,这是该深度学习模型的基本理解,后续都是在深化其中的细节处理。然后以容易理解的方式,引出异质图卷积网络RGCN的由来,主要讲解其核心公式和论文中作者所提出的两种降低模型参数量/优化的处理办法,并给出基础分解以及块对角分解的核心实现代码讲解。最后附上RGCN源代码及说明。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1279

MYSQL无法插入GUID问题

如果我们尝试在MySQL 5.6之前的版本中使用UUID数据类型,则会收到版本错误的问题。,MySQL支持UUID数据类型,可以使用。,无法使用UUID数据类型。如图所示,在插入guid时出现了。在查询了大量资料后发现在。数据类型来存储UUID。

qq_45788135的博客 331

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

FT2004(D2000)开发实战之AMD R5 230显卡驱动适配

AMD R5 230显卡驱动适配

嵌入式Linux 3194

mysql主键为guid_闲谈系列之一——数据库主键GUID

昨日一个行内兄弟由于工作调动要派到某二线城市工作,虽然有高额工资和补助的诱惑但也难以释怀离京蛋蛋的忧桑,约好晚上到老聚点道个别、主要是聊(chui)聊(chui)前(niu)程(bi),几瓶夺命大绿棒子下肚,这货问起我现在项目的情况(操蛋的技术控!),我简单的说了一下架子和数据库,果然在数据库主键上出现了分歧,在他心里主键就是应该是妥妥的自增整型,对于我的GUID无法容忍,并指出GUID不连续、效...

weixin_31632707的博客 1617

vue3 - 详细实现内网使用离线高德地图功能,在vue3中无需网络离线使用高德地图相关功能,高德地图如何离线加载详细教程(内网部署及使用),提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制)

vue3,高德地图,离线使用高德地图,高德地图瓦片官方下载,内网使用高德地图离线无网络,断网情况下使用高德地图,vue离线高德地图教程,内网部署高德地图,无需联网离线使用,vue3+ts实现离线高德地图 内网离线高德地图,如何在高德地图Vue3项目中下载离线地图,地图加载不出来,不显示怎么办,内网使用离线高德地图加载失败问题,vue3实现离线地图+高德瓦片,vue3高德离线地图,如何使用离线高德地图和自定义地图样式,高德离线地图的下载,怎么下载高德地图瓦片,一键把所有瓦片都下载下来,离线加载,内网部署,离线

✅ 精选推荐文章 1万+

SQL GUID和自增列做主键的优缺点

SQL GUID和自增列做主键的优缺点 公司的数据库全部是使用GUID做主键的,很多人习惯使用int做主键。所以呢,这里总结一下,将两种数据类型做主键进行一个比较。 主键自增为什么比随机和自定义快? 1、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页 2、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随...

chenxi004的博客 3214

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql 自增列 类型_MySQL--自增列学习

##=====================================================================================##在数据库表设计中会纠结于”自然键”和”代理键”的选择,自然键在实现数据“软删除”时实现比较复杂,部分自然键因为键值过长或多列组合导致不适合作为表主键,而比较常见两种代理键为自增列(auto incremnet)和全局唯一标...

weixin_35998457的博客 1712

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

mysql是什么1001mysql是什么_MySQL自增键介绍

在数据库表设计中会纠结于”自然键”和”代理键”的选择,自然键在实现数据“软删除”时实现比较复杂,部分自然键因为键值过长或多列组合导致不适合作为表主键,而比较常见两种代理键为自增列(auto incremnet)和全局唯一标识列(GUID)。使用自增列作为主键的优缺点:1、 主键键值长度短,INT列需要4个字节,BIGINT列需要8个字节;2、 自增主键顺序递增,在INSERT操作时”顺序”写入表;...

weixin_42436482的博客 306

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MySQL--”自然键”和”代理键”优缺点

在数据库表设计中会纠结于”自然键”和”代理键”的选择,自然键在实现数据“软删除”时实现比较复杂,部分自然键因为键值过长或多列组合导致不适合作为表主键,而比较常见两种代理键为自增列(auto incremnet)和全局唯一标识列(GUID)。 使用自增列作为主键的优缺点: 1、 主键键值长度短,INT列需要4个字节,BIGINT列需要8个字节; 2、 自增主键顺序递增...

weixin_30377461的博客 432

数据库主键设计中自增ID和Guid的比较

自增ID与Guid的比较

weixin_44171249的博客 728

数据库主键设计用自增还是用 GUID比较好

使用自增的方式做主键的优点: 1、数据的存储空间小,节省空间。 2、insert和update操作时使用INT等类型性能会比GUID好,但是优势在15%以下。 int自增序列 GUID性能测试 http://blog.youkuaiyun.com/fox123871/article/details/6578922 3、可读性会好,对人类友好一点。 5、支持通过函数获取最新的值,如:Scope_Indentity() 。 1 2 3 4 5 6 7 8 9 使用自增的方式做主键的缺点 1、如果经常有合并表的操作,就可能会

weixin_46879188的博客 1293

MySQL--自增列学习

##=====================================================================================## 在数据库表设计中会纠结于”自然键”和”代理键”的选择,自然键在实现数据“软删除”时实现比较复杂,部分自然键因为键值过长或多列组合导致不适合作为表主键,而比较常见两种代理键为自增列(auto incremnet)和全局唯...

weixin_34268610的博客 236

EF Core 主键

有的数据库支持部分的连续Guid,比如SQLServer中的NewSequentialId(),但也不能解决问题。在MySQL中,插入频繁的表不要用Guid做主键。主键值由两部分组成:高位(Hi)和低位(Lo),高位由数据库生成,两个高位之间间隔若干个值,由程序在本地生成低位,低位的值在本地自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题。

Anoxia_li的博客 633

设计表的时候,对于自增列做物理主键使用的一点思考

本文出处:http://www.cnblogs.com/wy123/p/7581380.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 关于自增列 自增列作为数据库的一个特性之一,在MSSQL和MySQL以及Oracle中都被支持。之前在网上发现一个类似的问题,是关于MySQL的:“为什...

weixin_30545285的博客 84

分布式唯一主键生成策略的一种开销比较小的方法

原文链接:http://www.javaarch.net/jiagoushi/709.htm 分布式唯一主键生成策略的一种开销比较小的方法 分布式场景下,经常需要做分库分表,master和master结构,那么此时就会用到全局的唯一主键id。 如果使用mysql的分区策略,master到master的复制,那么此时就需要保证分区的唯一性避免主键冲突。 我们可以使用mysql

程序员之路 9409

各种临时表插入数据方式对比(包括自增列和GUID列)

USE tempdbGOSET STATISTICS TIME OFF SET STATISTICS io OFF drop table #resultcreate table #result( [插入行数] int , [正常临时表] int, [行压缩临时表] int, [into方式创建临时表] int, [新加GUID列的临时表] int, [页压缩临时表] int, [行压缩临时...

weixin_34138521的博客 213
上一篇: .net反编译的九款神器
下一篇: 使用Guid做主键和int做主键性能比较
chenrui310
博客等级 码龄15年 165粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值