我在为大量数据设计数据库的过程中,我想知道主键使用什么数据类型?
将进行表分区,数据库最终将被集群化,并将热故障转移到替代数据中心。
编辑
表格 - 考虑多个时间段和多个事物的聊天系统,与多个用户聊天的时间段和事物。
指数问题是我正在考虑的 - 即某些东西可能会在短时间内生成数十亿行。即在我们可以更改数据库或 DBA 做 DBA 事情之前
马克 - 我和你一样关心 GUID - 我不喜欢 GUID 飞来飞去的编码。
我在为大量数据设计数据库的过程中,我想知道主键使用什么数据类型?
将进行表分区,数据库最终将被集群化,并将热故障转移到替代数据中心。
编辑
表格 - 考虑多个时间段和多个事物的聊天系统,与多个用户聊天的时间段和事物。
指数问题是我正在考虑的 - 即某些东西可能会在短时间内生成数十亿行。即在我们可以更改数据库或 DBA 做 DBA 事情之前
马克 - 我和你一样关心 GUID - 我不喜欢 GUID 飞来飞去的编码。
仅凭您提供的一点点信息,我建议您使用BigInt,这将使您达到 9,223,372,036,854,775,807,这是您不可能超过的数字。(不要从 INT 开始,并认为当您超过 20 亿行时您可以轻松地将其更改为 BigInt。这是可能的(我已经做到了),但可能需要很长时间,并且涉及重大的系统中断。)
Kimberly Tripp 有一系列关于创建聚簇索引和选择主键(相关问题,但并不总是完全相同的问题)的优秀系列博客文章(GUIDs as PRIMARY KEYs and/or the clustering key and The Clustered Index Debate Continues ) )。她的建议是聚集索引/主键应该是:
如果您使用 BigInt 作为键和聚集索引的递增标识,则应该满足所有这四个要求。
编辑:我上面提到的 Kimberly 的文章(GUIDs as PRIMARY KEYs 和/或集群键)讨论了为什么(客户端生成的)GUID 是集群键的错误选择:
但是,一个非连续的 GUID——比如它的值在客户端(使用 .NET)或由 newid() 函数(在 SQL Server 中)生成的 GUID 可能是一个非常糟糕的选择——主要是因为碎片化它在基表中创建,但也因为它的大小。它不必要地宽(它比基于 int 的标识宽 4 倍——它可以为您提供 20 亿(实际上是 40 亿)个唯一行)。而且,如果您需要超过 20 亿行,您总是可以使用 bigint(8 字节 int)并获得 263-1 行。
SQL 有一个名为 NEWSEQUENTIALID() 的函数,它允许您生成避免碎片问题的顺序 GUID,但它们仍然存在不必要的宽问题。
您总是可以选择int但考虑到您的分区/集群,我建议您查看将生成全局唯一键的uniqueidentifier 。
int 往往是规范,除非您需要大量数据,并且具有使用IDENTITY
等的优势;Guid
如果您希望数字不可猜测或可导出,则具有一些优势,但是如果您使用 a Guid
(除非您自己将其生成为“梳理”),则应确保它是非集群的(即索引;不是农场),因为它不会是增量的。
我认为 int 会非常适合它。
INTEGER 的范围是 - 2147483648 到 2147483647。
您也可以使用 UniqueIdentifier (GUID),但在这种情况下