GUID与INT IDENTITY

时间:2009-05-06 12:17:36

标签: database primary-key guid

  

可能重复:
  How do you like your primary keys?

我知道使用GUID的好处,以及在数据库中使用和INT作为PK的好处。考虑到GUID本质上是128位INT而普通INT是32位,INT是节省空间(尽管这一点在大多数现代系统中通常都没有用)。

最后,在什么情况下你会看到自己使用INT作为PK而不是GUID?

13 个答案:

答案 0 :(得分:20)

Kimberley Tripp(SQLSkills.com)使用GUID作为主键an article。由于不必要的开销,她建议反对它。

答案 1 :(得分:16)

除了在需要同步多个数据库实例时选择不好时,INT还有一个我没有提到的缺点:插入总是出现在索引树的一端。当你有一个具有大量移动的表时,这会增加锁争用(因为相同的索引页必须通过并发插入来修改,而GUID将被插入到整个索引中)。如果使用B *树或类似的数据结构,则还可能必须更频繁地重新平衡索引。

当然,在进行手动查询和报告构建时,int更容易看到,并且空间消耗可能通过FK使用而增加。

我有兴趣看到有关例如SQL Server实际上使用IDENTITY PK来处理大量插入的表。

答案 2 :(得分:13)

回答你的问题: 最后,在什么情况下你会看到自己使用INT作为PK而不是GUID?

如果我的系统具有离线版本的在线/离线版本,我可以使用GUID,您可以保存数据,并且在同步期间有一天将数据传输回服务器。这样,您确定在数据库中两次不会使用相同的密钥。

答案 3 :(得分:13)

  

INT是一个节省空间(尽管如此)   在大多数现代人中,这一点通常都没有用   系统)。

不是这样。乍一看似乎是这样,但请注意,每个表的主键将在索引中的整个数据库中重复多次,并在其他表中作为外键重复。它几乎涉及任何包含其表的查询 - 当它是用于连接的外键时非常密集。

此外,请记住,现代CPU非常非常快,但RAM速度却没有跟上。因此缓存行为变得越来越重要。获得良好缓存行为的最佳方法是使用较小的数据集。因此,4到16个字节之间看似无关的差异很可能会导致速度明显不同。不一定总是 - 但这是需要考虑的事情。

答案 4 :(得分:12)

我们在各地的复杂企业软件中都有Guids。工作顺利。

我认为Guids在语义上更适合作为标识符。在遇到这个问题之前,没有必要担心性​​能问题。注意过早优化。

任何类型的数据库迁移都有一个优势。使用Guids,您将不会发生碰撞。如果您尝试合并使用int用于标识的多个DB,则必须替换它们的值。如果在网址中使用了这些旧值,那么在搜索引擎优化后它们将会有所不同。

答案 5 :(得分:6)

在比较主键与外键之间的关系时,INT会更快。如果表格被正确编入索引并且表格很小,您可能看不到太慢,但您必须尝试确保。 INT也更容易阅读,并与其他人沟通。简单地说,“你能看一下1234的记录吗?”而不是“你能看一下记录031E9502-E283-4F87-9049-CE0E5C76B658吗?”

答案 6 :(得分:3)

某些操作系统不再根据独特的硬件功能(CPUID,MAC)生成GUID,因为它使跟踪用户变得容易(隐私问题)。这意味着GUID的唯一性通常不再像许多人想象的那样普遍。

如果您使用数据库的某些auto-id功能,理论上数据库可以绝对确保没有重复。

答案 7 :(得分:3)

如果数据存在于单个数据库中(因为我们一般编写的应用程序的大多数数据都是这样),那么我使用IDENTITY。打算使用这种方式很简单,不会破坏聚集索引并且绰绰有余。如果你使用负值,你将耗尽20亿个记录(如果你使用负值,大约40亿),但如果你在一个表中有那么多记录,那么你就会干杯,然后你就会遇到数据仓库问题。 / p>

如果数据存在于多个独立数据库或与第三方服务的接口中,那么我将使用可能已生成的GUID。一个很好的例子是数据库中的UserProfiles表,它通过Active Directory分配给它们的objectGUID将Active Directory中的用户映射到应用程序中的用户配置文件。

答案 8 :(得分:3)

如果您计划在某个阶段合并数据库,即对于多站点复制类型设置,Guid会节省很多痛苦。但除此之外,我发现Int更容易。

答案 9 :(得分:2)

我一直认为PK应该是可能的数字。不要忘记将GUID作为PK可能意味着它们也在其他表中用作foriegn键,因此分页和索引等会更大。

答案 10 :(得分:1)

我认为数据库也很重要。从MySQL的角度来看 - 通常,数据类型越小,性能越快。

对于int vs GUID似乎也适用 - http://kccoder.com/mysql/uuid-vs-int-insert-performance/

答案 11 :(得分:1)

如果此键绑定到类似的值,我将使用GUID作为PK。例如,用户标识(WinNT中的用户使用GUID描述)或用户组标识。 另一个例子。如果您开发用于文档管理的分布式系统,并且世界各地的不同地方的系统的不同部分都可以创建一些文档。在这种情况下,我会使用GUID,因为它保证在分布式系统的不同部分创建的2个文档不会具有相同的Id。

答案 12 :(得分:0)

在调试时,INT肯定更容易阅读,而且要小得多。

但是,我会使用GUID或类似产品作为产品的许可证密钥。你知道它会是独一无二的,你知道它不是顺序的。