需求:最近面试的时候被问到 SQL Server 数据库 int 和 guid 做主键有什么区别,两者做主键虽然都用到过,但是,并没有深入的了解,两者均有利弊,请根据自己实际业务场景进行权衡。
原文一:https://www.cnblogs.com/dullbaby/p/5112386.html
使用INT做主键的优点:
1、需要很小的数据存储空间,仅仅需要4 byte 。
2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。
3、index和Join 操作,int的性能最好。
4、容易记忆。
5、支持通过函数获取最新的值,如:Scope_Indentity() 。
使用INT做主键的缺点
1、如果经常有合并表的操作,就可能会出现主键重复的情况。
2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。
3、很难处理分布式存储的数据表。
使用GUID做主键的优点:
1、它是独一无二的。
2、出现重复的机会少。
3、适合大量数据中的插入和更新操作。
4、跨服务器数据合并非常方便。
使用GUID做主键的缺点:
1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。
2、很难记忆。join操作性能比int要低。
3、没有内置的函数获取最新产生的guid主键。
4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。
总结:
上面列出了GUID和INT两种数据类型做主键优缺点。我觉得,对于大数据量,建议使用guid做主键。而使用int会得到最佳的性能。
评论:使用有序的GUID性能会提高很多。
原文二:https://qa.social.msdn.microsoft.com/Forums/expression/zh-CN/70740eaa-bbb6-4cba-8693-a11e712869fa/sqlguididentity?forum=sqlserverzhchs
identity 是整武型类型就可以了, decimal不带小数的定义, bigint 均可
guid 是固定的 binary(16), 也就是16个字节
identity 是递增(或减), 而 guid 是随机的, 所以随着数据的插入, 前者不会产生什么碎片, 而后者会, 并且由于后者是无序的, 插入时还得调整顺序,所以性能上, 一般是前者优于后者.
大量信息一般会分表, 所以identity在很多情况下还是比较适用的
至于主键的意义, 这个看你设计时是怎么考虑的, 对于数据处理本身而言, 主键并不需要有意义, 而如果你要求主键中包含业务意义的话, 那么identity主键当然就是没意义的, 但一般来说, 业务意义和数据处理分开会更好一些, 业务始终是变化的, 如果你要把意义带到表设计的主键中, 那么业务变化, 你要调整的表结构也会比较多.
原文三:https://www.cnblogs.com/xdot/p/6054415.html
1.在经常需要做数据迁移的系统中,建议用Guid。并且在相应的外键字段,也就是用来做连接查询的字段添加非聚集索引,对于改善性能有极大的好处。where条件的字段也可以适当添加非聚集索引。
2.在使用Guid类型作为主键时,数据类型应为uniqueidentifier,并且一定要记得取消主键的“聚集索引”
3.对于不需要做迁移,或小型系统,用int做主键还是很方便的,并且在效率方面还是有一定提升的。
(完)
|