首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在数据库设计中作为主键的唯一标识符(guid)

在数据库设计中作为主键的唯一标识符(guid)
EN

Stack Overflow用户
提问于 2012-03-15 19:49:06
回答 5查看 25.6K关注 0票数 21

我们的数据驻留在SQL Server 2008数据库中,表之间会有很多查询和连接。我们在团队内部有这样的争论,一些人争论使用整数标识更好地提高性能,一些人争论使用guid (唯一标识符)。

使用GUID作为主键时,性能真的会如此糟糕吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-15 20:12:43

当然,128位GUID (uniqueidentifier)密钥比32位int密钥大4倍。然而,它有几个关键的优点:

  • 合并content
  • 时没有“标识插入”问题如果使用梳状值而不是NEWSEQUENTIALID(),则会得到一个“免费”插入时间戳。如果你想要一些花哨的CAST()调用,你甚至可以根据日期/时间范围从主键进行SELECT
  • 它们是全局唯一的,这被证明是非常方便的。
  • 由于不需要跟踪高水位线,你的BL层可以赋值而不是SQL
  • ,这样就省去了SELECT scope_identity()在插入后获取主键的步骤。
  • 如果你有超过20亿条记录的可能性很小,您需要使用bigint (64位)而不是int。一旦你这样做了,GUID只有bigint.
  • Using的两倍大,这使得在URL中公开键更安全,等等,而不会让你自己暴露在“猜测ID”中SQL uniqueidentifier如何从磁盘加载页面,以及处理器现在大多是64位的,仅仅因为一个数字是128位而不是32位并不意味着比较所需的时间增加了4倍。我看到的最后一个测试显示GUID几乎同样快。
  • 索引的大小取决于所包含的列数。尽管GUID本身较大,但与索引中的其他列相比,额外的8或12个字节可能并不重要。

最后,通过使用整数挤出一些小的性能优势可能不值得失去GUID的优势。从经验上测试它,然后自己决定。

就我个人而言,我仍然会根据情况使用这两种方法,但在我的情况下,决定因素从来没有真正归结为性能。

票数 36
EN

Stack Overflow用户

发布于 2012-03-15 21:37:23

我个人使用INT IDENTITY作为我的大多数主键和集群键。

您需要将主键分开,这是一个逻辑结构-它唯一地标识您的行,它必须是唯一的、稳定的和NOT NULL的。GUID也适用于主键-因为它被保证是唯一的。如果您使用SQL Server复制,则GUID作为主键是一个很好的选择,因为在这种情况下,您无论如何都需要一个唯一标识GUID列。

SQL Server中的集群关键字是一种物理结构,用于数据的物理排序,要正确处理要困难得多。通常,SQL Server上的索引女王Kimberly Tripp还要求一个好的聚集键是唯一的、稳定的、尽可能窄的,并且理想情况下是不断增加的(所有这些都是INT IDENTITY )。

在这里查看她关于索引的文章:

也可以看看吉米·尼尔森的The Cost of GUIDs as Primary Key

GUID对于聚集键来说是一个非常糟糕的选择,因为它是广泛的,完全随机的,因此会导致糟糕的索引碎片和糟糕的性能。此外,聚类关键字行也存储在每个非聚集(附加)索引的每个条目中,所以您真的希望保持它很小- GUID是16字节,INT是4字节,并且有几个非聚集索引和数百万行,这会产生巨大的差异。

在SQL Server中,默认情况下,您的主键是您的聚集键-但它不是必须的。您可以很容易地使用GUID作为您的非集群主键,并使用INT IDENTITY作为您的集群键-这只需要一点了解。

票数 23
EN

Stack Overflow用户

发布于 2012-03-16 04:47:51

使用GUID作为主键的一个大问题是,它们会导致大量的表碎片,这可能是一个很大的性能问题(表越大,问题就越大)。即使作为非聚集索引的键,它们也会导致索引碎片。

您可以通过设置适当的填充因子来部分缓解这个问题--但这仍然是一个问题。

大小的差异对我来说并不是很麻烦,除了那些行数很窄的表,这些表也需要表扫描。在这些情况下,每个DB页面能够容纳更多行是一种性能优势。

使用GUID可能有很好的理由,但也是有代价的。我通常更喜欢主键的INT标识,但当GUID是更好的解决方案时,我不会避免使用GUID。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9727090

复制
相关文章
java开发_UUID(Universally Unique Identifier,全局唯一标识符)和GUID(Globally Unique Identifier,全球唯一标识符)
GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) 。
Hongten
2018/09/13
1.2K0
数据库模型设计——主键的设计
在数据库设计时,主要就是对实体和关系的设计,实体表现出来就是表,关系表现出来就是外键。而对于一个表,由两部分组成:主键和属性。主键的简单定义就是表中为每一行数据的唯一标识。其实更准确的说法,每一行数据的唯一标识是候选键(Candidate Key),一个表中可以有很多个候选键,主键是候选键中的一个,主要用于更方便的检索和管理数据。一个表中可以有多个候选键,但是只有一个主键。由于主键常常用于检索数据,也用于表之间的关联,所以主键的设计的好坏将会严重影响数据操作的性能。下面来介绍下主键设计的几个考虑因素。
深蓝studyzy
2022/06/16
1.1K0
uniqueidentifier什么意思_数据类型int是什么意思
uniqueidentifier数据类型可存储16字节的二进制值,其作用与全局唯一标记符(GUID)一样。GUID是唯一的二进制数:世界上的任何两台计算机都不会生成重复的GUID值。GUID主要用于在用于多个节点,多台计算机的网络中,分配必须具有唯一性的标识符。 在SQL中 ROWGUIDCOL表示新列是行的全局唯一标识列。对于每个表只能指派一个uniqueidentifier 列作为ROWGUIDCO列。ROWGUIDCOL属性只能指派给uniqueidentifier列 ;
全栈程序员站长
2022/10/03
1.4K0
数据库:SQLServer中GUID用法介绍
NEWSEQUENTIALID() 不能在查询语句中使用,比如不能执行SELECT NEWSEQUENTIALID()这样的语句;
小明互联网技术分享社区
2021/03/07
1.3K0
分布式_全局唯一GUID
UUID(Universally Unique Identifier)是国际标准化组织(ISO)提出的一个概念。UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位比特。
Yatao Feng
2021/11/05
1.3K0
主键、唯一键与唯一索引的区别
一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。
全栈程序员站长
2022/07/15
1.3K0
主键和唯一约束的索引肯定唯一?
这两天在开发过程中,有个需求,就是找出某个schema的所有主键索引和唯一约束索引的名称,逻辑中用到了dba_indexes,其中存在一个字段叫UNIQUENESS,官方文档解释是说该字段会标记索引是唯一的(UNIQUE)还是非唯一的(NONUNIQUE),能不能这样理解,对主键索引和唯一约束索引来说,这个字段应该是UNIQUE?
bisal
2021/09/06
1.3K0
主键和唯一约束的索引肯定唯一?
淘宝数据库,主键如何设计的?
聊一个实际问题:淘宝的数据库,主键是如何设计的? 某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显 的错误就是关于MySQL的主键设计。
一个风轻云淡
2022/11/15
1.4K0
淘宝数据库,主键如何设计的?
sql server 聚集索引,非聚集索引,Identity ,gudi,主键的概念和比较
可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
SpringSun
2022/05/26
9160
sql server 聚集索引,非聚集索引,Identity ,gudi,主键的概念和比较
唯一主键方案之数据库维护区间分配
我们介绍一种基于数据库维护自增 ID 区间,结合内存分配的策略,这也是淘宝的 TDDL 等数据库中间件使用的主键生成策略。
JMCui
2021/08/20
6270
mysql 唯一索引_mysql主键和唯一索引的区别
普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。 全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。 联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
全栈程序员站长
2022/11/05
2.9K0
[置顶] SQL Server数据库高级进阶之分布式唯一ID生成实战演练
一、背景需求 当我们需要在多个数据库间进行数据的复制自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢? 数据库自增长ID和无序的UUID方案的不足之处: 1)、采用数据库自增序列:数据迁移合并等比较麻烦。 2)、UUID随机数:采用无意义字符串,没有排序UUID使用字符串形式存储,数据量大时查询效率比较低。(主要是索引查询销量不是最高的) 如果非要使用非自主增长列作为主键的话(分布式系统分库分表中)
跟着阿笨一起玩NET
2022/03/22
1.2K0
[置顶]
        SQL Server数据库高级进阶之分布式唯一ID生成实战演练
DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
简要介绍          在我们进行数据库设计的时候,大家都会考虑到数据表主键的设计,而可能没有人去关注记录唯一性字段设计,或者说,很多开发人员把这两种混合在一起处理,即就是表记录的唯一性与主键相结合的技术,因为从本质上讲,表主键的值是必须唯一的,他即能确保表记录的唯一性。          我在本文提出的思路是分离表记录的唯一性与主表键的设计,也可以理解为是双主键的设计思路,即唯一性设计可以与表业务无关,而表主键的设计必须与业务相关联,一个主键记录一定能具有一定的业务意义。 主键设计的争议       
魏琼东
2018/01/12
6810
DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
SQL Server数据库高级进阶之分布式唯一ID生成实战演练
一、背景需求 当我们需要在多个数据库间进行数据的复制自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时,OrderID到底该不该自动增长呢? 数据库自增长ID和无序的UUID方案的不足之处: 1)、采用数据库自增序列:数据迁移合并等比较麻烦。 2)、UUID随机数:采用无意义字符串,没有排序UUID使用字符串形式存储,数据量大时查询效率比较低。(主要是索引查询销量不是最高的) 如果非要使用非自主增长列作为主键的话(分布式系统分库分表中)
跟着阿笨一起玩NET
2020/07/09
2.2K0
SQL Server数据库高级进阶之分布式唯一ID生成实战演练
唯一索引与主键索引的比较
唯一索引 唯一索引不允许两行具有相同的索引值。 如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,用户表中的身份证(idcard) 列上创建了唯一索引,则所有身份证不能重复 主键索引 主键索引是唯一索引的特殊类型。 数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查
joshua317
2018/04/16
3.1K0
软件测试|MySQL主键自增详解:实现高效标识与数据管理
在MySQL数据库中,主键自增是一种常见的技术,用于自动为表中的主键字段生成唯一的递增值。本文将深入讨论MySQL主键自增的原理、用途、使用方法,以及在实践中的注意事项和最佳实践。
霍格沃兹测试开发Muller老师
2023/10/25
5230
ABAP 生成唯一标识字段uuid ,guid
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
百里丶落云
2022/12/05
3K0
ABAP 生成唯一标识字段uuid ,guid
【说站】mysql主键和唯一的区别
以上就是mysql主键和唯一的区别,希望对大家有所帮助。更多mysql学习指路:MySQL
很酷的站长
2022/11/23
1.1K0
【说站】mysql主键和唯一的区别
淘宝数据库,主键如何设计的?(文末福利)
某些错的离谱的答案还在网上年复一年的流传着,甚至还成为了所谓的MySQL军规。其中,一个最明显的错误就是关于MySQL的主键设计。
小熊学Java
2023/07/16
4630
淘宝数据库,主键如何设计的?(文末福利)
点击加载更多

相似问题

guid作为主键?

43

使用C# Guid作为唯一的非主键字段

20

同步数据库时作为主键的唯一标识符

22

OrmLite -在Oracle中作为主键的GUID

10

使用唯一标识符作为主键的好处?在sql server中

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文