开发者社区> 玄学酱> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

谈数据库主键选取策略

简介:
+关注继续查看

INT和GUID,究竟选谁?

  关于数据库主键的选取策略,大家都是在INT和GUID两者中徘徊。忘了那些喋喋不休的争论吧!毕竟鱼与熊掌,不可兼得。在这篇文章中,我们不再关注它们的优缺点,自觉先行做点功课哦!

  如小标题,如果真要选,我会选谁?肯定地说,我会选GUID,又或者两者都选上。后者情形下,使用GUID做主键、INT做小二,INT在业务层生成,这要即使重复了,也不碍事,且INT是要反馈给前端的,定时做一个防冲突检测。如果让用户记忆或反馈那GUID字符串(去连接字符后32位),可以直接去跳楼了!

  INT和GUID,究竟谁快?

  使用INT或GUID做主健,究竟谁更快?为回答这个问题,我们先看下面的表格内容:

  解释一下:

  1、uniqueidentifier存储为二进制值,为什么是16字节呢?0~f 共16 种表示,有16*16=256,也有2^8=256(值域为0~255),去掉四个连接字符,即表示为16字节。

  2、varchar和nvarchar属变长型,存储时会增加一个int类型(四个字节)记录内容长度。

  3、nchar和nvarchar类型存储为Unicode数据,占用两个字节,所以字节数要算双份。

  谁会更快?

  1、勿庸置疑,INT肯定是最快的,甚至你会选择int而不是bigint。

  2、其次,谁会更快?当选uniqueidentifier。

  3、项目中,选用了varchar、nchar、nvarchar中某一类型?只怕你会是神,不是人或妖。

  INT和GUID,谁主沉浮?

  项目中,如果你是使用INT做主健,那么接下来的内容可以直接略过?因为你已经得到了答案。

  写这篇随笔的主要目的,是要告诉大家,使用GUID做主键时,特别要注意索引与排序问题。

  GUID做主键,字段类型为char(36),数据记录索引与排序依据肯定是字符串的从左到右,即:12345678-0000-0000-0000-000000000000

  GUID做主键,字段类型为uniqueidentifier,数据记录索引与排序依据将是后六字节,即:00000000-0000-0000-0000-1234567890ab

  为什么会这样?数据存储为uniqueidentifier时,会体现为SqlGuid 结构。

  MSDN描述有:SqlGuid使用 SQL Server行为实现CompareTo,该行为只计算值的最后6个字节。Guid 计算全部 16 个字节。

  结束语

  为了验证所说,你可以这样做:建表并添加uniqueidentifier字段类型,随机插入几万条记录,然后观察后十二位字符的排序情况,或参考下面截图。








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据库分库分表策略的具体实现方案
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79879588 一、MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
1149 0
重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践
一、MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
1902 0
H2 数据库
最近做演示项目的时候需要一个数据库,但不想安装。于是查看了embedded datasource : h2   h2: 依赖: com.h2database h2    h2: 驱动名称: org.h2.Driver   h2: jdbc url: 内存模式: jdbc:h2:mem:test   embedded: jdbc:h2:file:./db/springboot 最关键的是,file要指定绝对路径,即不能jdbc:h2:file:db/springboot这样说报错,说没指定具体位置。
949 0
关于数据库的SQL超时实现策略
在执行SQL的时候,有可能需要限制SQL的最长执行时间。这个限制在JDBC和.NET Data Provider中分别通过下面两个方法设置。 其他数据库驱动可能也有类似的参数。 Statement.setQueryTimeout() DbCommand.CommandTimeout() 这个功能是很简单的,但是如何实现这个超时呢?不同的数据库驱动,可能会采取不同的方法。
824 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
20683
文章
438
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载