最近一直在做下一代CSDN社区的设计,在帖子编号到底采用Guid,还是自增Int选择的时候,花费了不少心思。
最后的确定的方案是采用Guid。
原因如下:
Guid 虽然在搜索、索引寻找的时候,速度肯定比不上Int型字段。
但是,如果帖子编号采用Guid,在提交到中间层之前,就可以知道要增加的这个帖子编号是那个。
而如果使用自增Int,如果中间层的应用逻辑需要在增加到数据库之前执行,那么我要做多少费时的操作才可以知道要新增的这个帖子编号是多少。如果这个中间过程比较费时,完了,肯定超时。
在大数据量下,使用Guid的上述好处体现的非常明显。
使用Guid,中间层可以引入队列的概念,表现层只要简单的向中间层待处理队列中增加一条,既可以返回了。而不用等中间层和数据库层处理完毕。
微软的BizTalk 中表示编号的是Guid,而不是Int,这就是其中一个原因。同时很多大型系统,也是使用的Guid而不是Int。 当然,你也可以使用一套自己的编号方式。不过Guid和Int是最简单的而已。
Guid 类型字段跟Int类型字段速度对比数据,可以参看以下Blog:
http://www.cnblogs.com/zhenyulu/archive/2004/07/20/25816.html
打印 | 张贴于 2004-11-29 17:02:00 | Tag:数据库开发管理心得
留言反馈
PS: 要是1/2^128的概率真被谁碰上,我觉得他可以天天去买彩票……
“就是要往数据库中间插入,这样才会有好的效果。因为数据库每个块都不是满的(填充因子),在中间插入只会影响插入位置的块。这样当有许多插入进行的时候,他们才不会打架。如果都是插入到表末尾,就会对对最后一个块的操作发生争抢。”
不认同你的说法,效率肯定时直接在表尾插入高。物理写入时顺序写入的效率肯定比不确定性的插入高。因为不确定写入要求对磁盘写入头的移动位置不确定。需要不确定个数的移动周期才能完成整个写入过程。还有什么比物理硬件的操作更费时的。
我感觉还是用GUID作为非聚集主键好,用创建时间作为聚集索引。
"说真的,guid在生成的时候,大小(指排序)的随机性太大了,如果把它做PK,insert的时候往往要往数据库的中间里插..那对于千万个帖子的操作的成本真是恐怖啊..(每插一条记录不知要移动多少数据在磁盘中的位置...) "
就是要往数据库中间插入,这样才会有好的效果。因为数据库每个块都不是满的(填充因子),在中间插入只会影响插入位置的块。这样当有许多插入进行的时候,他们才不会打架。如果都是插入到表末尾,就会对对最后一个块的操作发生争抢。
以自增长的INT数做为主键
而用GUID做数表之间的关联键。
这样,INT键可用日常工作
GUID可以确保在多个表中,直接增加记录,而不需要在增加记录后,再从数据库中取回用于表间关联的键
对于已经结贴的纪录,由于不能被修改,可以放到数据仓库中
水木虽然有自动删帖功能,但我想如果服务器允许的话,应该也都是可以保留下来的。
---->>避免将该主键设置为聚集索引就可以了!
可以考虑guid与id合用啊.
例如
topicid int,topicguid uniqueidentifier
把
topicid作为自动编号的PK,topicguid只作为常规索引,那么也是很好的解决方法吧.
另外,我之前做的一套是用时间来做id的呵呵:
topicid bigint
我在C#那里有一个时间分配器,得到的是比大于或等于DateTime.Now.Ticks的一个长整数.
因为程序部署在一个应用程序域内,所以这个很好控制不重复的问题..
(但是这个却无法部署到群集里了,因为各机器的时间相差一两秒就无法保证大小的次序问题和重复的问题了)
就可以在"最终"客户端生成,预知 ID ! (太理想了)
本题没必要这样,所以 smartphone/pocket pc 不支持GUID的生成也无所谓!
在同一台(中间件)机器(Web Server OR App Server 不是 DB Server)上生成 GUID ,应该肯定永远不会重复!
to SpiderMan:
"生成guid的过程可以放在数据库端" 该讨论岂不没意义了?
为了 Order By 是不是还要最好加上一个 Auto ID?????
编成上的那点小麻烦....值得的
还有很多人千方百计研究CLR,为了5%的提高拼命优化代码呢
msdn上面说的,还是有可能会重复对嘛?
guid会不会重复?
数据被 蜘蛛/小偷程序读取的难度
最起码不能很简单的 按照开始编号和结束编号就去盗了
1。复制使用guid主键的数据库时,不必做额外的检查
2。guid值的随机性可以减少数据库的热点
3。guid可以避免用户使用具有实际意义的主键
4。guid可以避免连接这样的错误,即,查询时连接了错误的表,但系统依旧返回了结果。
5。guid的值是用不完的
6。可以使用多种方式来生成guid值
他们的性能到底差多少呢?是不是一个可以接受的数量级呢?