谈数据库主键选取策略

上一篇 / 下一篇  2012-08-01 10:27:47 / 个人分类:数据库

$B.gy/T*X(}!^-J0  INT和GUID,究竟选谁?

X%FG3w2R/w051Testing软件测试网lw A at

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

yv'B;B3l,k051Testing软件测试网B R3Abqi"`&QO

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

51Testing软件测试网j;~&k4k&@$e*as z&r

  INT和GUID,究竟谁快?51Testing软件测试网t{n;f]@!m*M4G

5L8h.LYqRC&Q0  使用INT或GUID做主健,究竟谁更快?为回答这个问题,我们先看下面的表格内容:51Testing软件测试网{G8H;o E m9v+QV-TQ

{2P{S T|-\,Z w0

  解释一下:51Testing软件测试网l^2J,c7{(o

  1、uniqueidentifier存储为二进制值,为什么是16字节呢?0~f 共16 种表示,有16*16=256,也有2^8=256(值域为0~255),去掉四个连接字符,即表示为16字节。51Testing软件测试网 I [ gV v8R5c,Ze

  2、varchar和nvarchar属变长型,存储时会增加一个int类型(四个字节)记录内容长度。51Testing软件测试网P*hiyGU1P

  3、nchar和nvarchar类型存储为Unicode数据,占用两个字节,所以字节数要算双份。51Testing软件测试网nmF+Hn-I

  谁会更快?

9w9e.E~%f\jy:N0

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

3V"n5E4j#})?CI h0

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

"{ued]+Gs&^*N0

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

E.i1KC&lxw\z!P0

  INT和GUID,谁主沉浮?

9P6`_^i7X0Uf0

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

"W#a0Wwfw0

  写这篇随笔的主要目的,是要告诉大家,使用GUID做主键时,特别要注意索引与排序问题。51Testing软件测试网jv `jWZ;o?m

  GUID做主键,字段类型为char(36),数据记录索引与排序依据肯定是字符串的从左到右,即:12345678-0000-0000-0000-00000000000051Testing软件测试网.S%a$JD] @!`jL

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

"@Y W(LBwa0

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

z5b'i0{0Oj0

  MSDN描述有:SqlGuid使用SQLServer行为实现CompareTo,该行为只计算值的最后6个字节。Guid 计算全部 16 个字节。51Testing软件测试网$o,e7X+j8z x

  结束语

:xYb@g(x0

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

8V)v,h4],s` ?0V0

bZ-\*W+B*U y&M0i-b0

TAG:

 

评分:0

我来说两句

Open Toolbar