蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 597, 评论 - 4064, 引用 - 276

导航

关于

这里是我的技术Blog,下一代CSDN社区Blog在 http://blog.csdn.net/ghj1976/

标签

每月存档

最新留言

  • re:学习笔记:7种结构型设计模式简单对比
    <p>最新在家创业系统 ----刚从国外引进,市场巨大。 ----在家可经营所有国家生意,事业规模宏大。 ----不需求人与说服;不用放厚脸皮去推销。 ----极小投资;零风险;成...
    by jackielongteng(注册) on 2009/6/14 13:43:56
  • re:作用域
    <p>☆                    &deg;∵☆       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
    by jackielongteng(注册) on 2009/6/14 13:03:25
  • re:Html标签嵌套对展示性能的影响
    <p><strong>所有的浏览器都按照你提到的浏览器解析Html规则来解析嘛?</strong></p>
    by Cola(注册) on 2009/6/12 23:07:28
  • re:Html5
    <p>目前来说,HTML5还只是一个梦想,呵呵:)</p>
    by 开心就好(注册) on 2009/6/11 16:31:54
  • re:多线程与SqlConnection.Close
    <p>好服月租型IT服务台,与你共成长! 月租型ITSM软件,注册即可免费体验! 详情请登录官方网站:<a href="http://www.servicezon.co...
    by qzhibo(注册) on 2009/6/3 15:14:21
  • re:多线程Singleton单件模式
    <pre><span style="color: #0000ff;">//Another way public</span> <sp...
    by Yaojian(注册) on 2009/4/22 14:02:35
  • re:Thread.Sleep(0)
    <p>学习了~</p>
    by shuitong888(注册) on 2009/4/8 14:29:24
  • re:Html标签嵌套对展示性能的影响
    <p>DIV固然好 但IE6,7,8 firefox,safari ....做美工的人要累死.</p>
    by ryq1(注册) on 2009/4/3 14:16:25
  • re:用.net 编码实现朗读文本的方法
    <p>我第一次 按键时 能听到声音,但是第二次按键时,没反应。网页一直在 loading.&nbsp;是什么原因?</p>
    by tracytang949(注册) on 2009/3/27 7:01:09
  • re:information_schema.routines与sysobjects
    <p>用sys.procedures多好。</p>
    by luke(注册) on 2009/3/16 16:45:49
  • re:SQL Server 2005 配置发送邮件
    <p>&lt;A href="<a href="http://www.3rt.info">http://www.3rt.info</...
    by ives007(注册) on 2009/2/26 16:47:00
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:45:08
  • re:推荐 Gemini 这个bug管理工具
    <p>你好!首先非常感谢推荐使用Gemini,这段时间在使用Gemini,有些问题想请教以下。</p> <p>1.Create Issue 以后,设置了Visib...
    by CowboyRyan(注册) on 2009/2/20 15:32:06
  • re:虚机搭配NLB负载平衡时碰到"没有接口可用于安装新的群集"的解决方案
    <p>google newsid</p>
    by iads(注册) on 2009/2/13 17:25:07
  • re:try catch 与线程
    <p>确实是这样的。因为异常机制本质上是堆栈操作,而各线程的堆栈是独立的。</p>
    by st_szr(注册) on 2009/1/21 9:46:05
  • re:try catch 与线程
    <p>没啥啊,线程就是新启动了一个,当然异常不会影响到原有的线程了。</p> <p>你应该在线程里面合适的位置写上自己的捕获代码就行了。</p>
    by laozizhu(注册) on 2009/1/19 16:33:21
  • re:我的2008,征服天堂
    <p>蝈蝈,可惜我帮不了你啊!</p>
    by laozizhu(注册) on 2009/1/19 16:25:45
  • re:try catch 与线程
    <p>呃&hellip;&hellip;是这样的。可怎么处理呢?</p>
    by Anders Liu(注册) on 2009/1/19 11:58:05
  • re:我的2008,征服天堂
    <p>博主是不是去了师部 做了侦查营长呢?</p>
    by huobazi(注册) on 2009/1/9 14:15:33
  • re:我的2008,征服天堂
    <p>@ghj1976:看来真的危机了</p>
    by 开心就好(注册) on 2009/1/9 10:17:37
  • re: 网络带宽的单位
    不过传输的时候,往往还有压缩。
    by luke(匿名) on 2008/12/15 11:00:21
  • re: 网络带宽的单位
    除10不仅仅是为了方便,在传输中,往往加上控制位,所以一个字节往往需要10Bit.
    by 关门放狗(匿名) on 2008/12/13 16:01:30
  • re: 多缓存并存
    对跨进程甚至跨服务器缓存的性能比较怀疑,进程通信和跨服务器通信代价不菲。即使有已有进程外数据可用,如果考虑在进程做份缓存,定期再进程间同步是否更佳?
    by jinglecat(匿名) on 2008/12/12 18:00:05
  • re: 网络带宽的单位
    好像还有一个为了方便换算,厂家使用的是 除10的处理方式的说法:于是100Mb/sec = 100M / 10 = 10M Byte/sec 所以我通常都是用除10而不是除8来做运算的。
    by kentliu(匿名) on 2008/12/11 11:38:55
  • re: 网络带宽的单位
    又不是大S小s
    by luke(匿名) on 2008/12/10 12:04:50

广告

 

最近一直在做下一代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:数据库开发管理心得

留言反馈

#回复: Guid 和 Int 作为系统编号的取舍 编辑
GUID生成时用到的数据包括本机的网卡物理地址,以及纳秒级的时间。所以虽然理论上存在重复的可能性,但这个可能性是可以忽略不计的。仅仅是“理论”而已~

PS: 要是1/2^128的概率真被谁碰上,我觉得他可以天天去买彩票……
2007-08-08 11:04:00 | [匿名用户:zzzz]
#回复: Guid 和 Int 作为系统编号的取舍 编辑
Guid的最大缺点就是费资源。

“就是要往数据库中间插入,这样才会有好的效果。因为数据库每个块都不是满的(填充因子),在中间插入只会影响插入位置的块。这样当有许多插入进行的时候,他们才不会打架。如果都是插入到表末尾,就会对对最后一个块的操作发生争抢。”

不认同你的说法,效率肯定时直接在表尾插入高。物理写入时顺序写入的效率肯定比不确定性的插入高。因为不确定写入要求对磁盘写入头的移动位置不确定。需要不确定个数的移动周期才能完成整个写入过程。还有什么比物理硬件的操作更费时的。

我感觉还是用GUID作为非聚集主键好,用创建时间作为聚集索引。
2007-02-12 14:50:00 | [匿名用户:hoo]
#回复: Guid 和 Int 作为系统编号的取舍 编辑
用Guid就对了 傻比才用int
2006-11-29 13:59:00 | [匿名用户:shao]
#re: Guid 和 Int 作为系统编号的取舍 编辑

"说真的,guid在生成的时候,大小(指排序)的随机性太大了,如果把它做PK,insert的时候往往要往数据库的中间里插..那对于千万个帖子的操作的成本真是恐怖啊..(每插一条记录不知要移动多少数据在磁盘中的位置...) "

就是要往数据库中间插入,这样才会有好的效果。因为数据库每个块都不是满的(填充因子),在中间插入只会影响插入位置的块。这样当有许多插入进行的时候,他们才不会打架。如果都是插入到表末尾,就会对对最后一个块的操作发生争抢。
2006-06-02 14:10:00 | [匿名用户:Jim]
#re: Guid 和 Int 作为系统编号的取舍 编辑
实际上SQL Server 内部索引一条记录本身就是用的GUID呀。
2005-10-10 09:32:00 | [匿名用户:dominic]
#re:Guid 和 Int 作为系统编号的取舍 编辑
^_~,pretty good!18showsseeoo
2005-04-25 16:30:00 | [匿名用户:sf6气体检测设备]
#re:Guid 和 Int 作为系统编号的取舍 编辑
^_^,Pretty Good!
2005-04-13 21:37:00 | [匿名用户:疲劳试验机]
#re:Guid 和 Int 作为系统编号的取舍 编辑
^_^,Pretty Good!
2005-04-10 19:36:00 | [匿名用户:冲击试验机]
#re: Guid 和 Int 作为系统编号的取舍 编辑
这样考虑这个问题可否?????

以自增长的INT数做为主键

而用GUID做数表之间的关联键。

这样,INT键可用日常工作

GUID可以确保在多个表中,直接增加记录,而不需要在增加记录后,再从数据库中取回用于表间关联的键
2005-03-03 14:26:00 | [匿名用户:随风]
#re: Guid 和 Int 作为系统编号的取舍 编辑
支持用GUID做主键,我想这可以带来许多设计上的好处。对于效率,我测试了一下,从客户端想sql server中插入10000条记录,用guid做主键的表比用int做主键的只慢2~3秒。select 中where后面用主键来定位记录,速度也差别很小
2005-01-30 13:34:00 | [匿名用户:困而学之]
#re: Guid 和 Int 作为系统编号的取舍 编辑
我觉得索引是一定要做的。
对于已经结贴的纪录,由于不能被修改,可以放到数据仓库中
2004-12-08 10:44:00 | [匿名用户:rottenapple]
#re: Guid 和 Int 作为系统编号的取舍 编辑
我不知道CSDN同时在线量能有多少,但像水木清华这类老式的BBS系统都能支持两万在线量,工作得还不错。当然整个工作模式都是不一样的,CSDN类论坛最大的好处是全文检索的能力吧?还是?
水木虽然有自动删帖功能,但我想如果服务器允许的话,应该也都是可以保留下来的。
2004-12-05 11:05:00 | [匿名用户:Evan]
#re: Guid 和 Int 作为系统编号的取舍 编辑
如果用GUID作主键,怎么进行排序呢?
2004-12-04 15:30:00 | [匿名用户:CodingPCPiG]
#re: Guid 和 Int 作为系统编号的取舍 编辑
我对你那个中间层的等待队列有兴趣,怎么搞的?
2004-12-02 21:14:00 | [匿名用户:caixikai]
#re: Guid 和 Int 作为系统编号的取舍 编辑
insert的时候往往要往数据库的中间里插..那对于千万个帖子的操作的成本真是恐怖啊

---->>避免将该主键设置为聚集索引就可以了!
2004-12-02 20:34:00 | [匿名用户:王勇]
#re: Guid 和 Int 作为系统编号的取舍 编辑
大型系统一般都有自己的主键生成器,生成一个类似guid但又含有某种规则的编码
2004-12-02 09:31:00 | [匿名用户:陈叙远]
#re: Guid 和 Int 作为系统编号的取舍 编辑
说真的,guid在生成的时候,大小(指排序)的随机性太大了,如果把它做PK,insert的时候往往要往数据库的中间里插..那对于千万个帖子的操作的成本真是恐怖啊..(每插一条记录不知要移动多少数据在磁盘中的位置...)

可以考虑guid与id合用啊.

例如

topicid int,topicguid uniqueidentifier


topicid作为自动编号的PK,topicguid只作为常规索引,那么也是很好的解决方法吧.

另外,我之前做的一套是用时间来做id的呵呵:

topicid bigint

我在C#那里有一个时间分配器,得到的是比大于或等于DateTime.Now.Ticks的一个长整数.
因为程序部署在一个应用程序域内,所以这个很好控制不重复的问题..
(但是这个却无法部署到群集里了,因为各机器的时间相差一两秒就无法保证大小的次序问题和重复的问题了)




2004-12-02 04:39:00 | [匿名用户:Lostinet]
#re: Guid 和 Int 作为系统编号的取舍 编辑
如果理想状态下 GUID 真的可以保证在所有星球,所有计算机,所有数据库,所有表之间都不会出现重复!?!?!?!
就可以在"最终"客户端生成,预知 ID ! (太理想了)


本题没必要这样,所以 smartphone/pocket pc 不支持GUID的生成也无所谓!
2004-12-01 13:24:00 | [匿名用户:playyuer]
#re: Guid 和 Int 作为系统编号的取舍 编辑
re: msdn上面说的,还是有可能会重复对嘛?

在同一台(中间件)机器(Web Server OR App Server 不是 DB Server)上生成 GUID ,应该肯定永远不会重复!


2004-12-01 13:04:00 | [匿名用户:playyuer]
#re: Guid 和 Int 作为系统编号的取舍 编辑
guid (帖子编号)可以在前端(WebServer)先生成,相当于预知了,

to SpiderMan:
"生成guid的过程可以放在数据库端" 该讨论岂不没意义了?

为了 Order By 是不是还要最好加上一个 Auto ID?????
2004-12-01 12:47:00 | [匿名用户:playyuer]
#re: Guid 和 Int 作为系统编号的取舍 编辑
guid有个缺陷是不方便排序
2004-11-30 15:07:00 | [匿名用户:怡红公子]
#re: Guid 和 Int 作为系统编号的取舍 编辑
哎,如果让我定,肯定用int做主键

编成上的那点小麻烦....值得的

还有很多人千方百计研究CLR,为了5%的提高拼命优化代码呢
2004-11-30 14:20:00 | [匿名用户:mvm]
#re: Guid 和 Int 作为系统编号的取舍 编辑
最后这句话说得很酷啊~但guid确实是个神奇的东西~
2004-11-30 11:38:00 | [匿名用户:myrat]
#re: Guid 和 Int 作为系统编号的取舍 编辑
guid可以保证在所有星球,所有计算机,所有数据库,所有表之间都不会出现重复!
2004-11-30 11:12:00 | [匿名用户:王勇]
#re: Guid 和 Int 作为系统编号的取舍 编辑
GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。此标识符重复的可能性非常小。

msdn上面说的,还是有可能会重复对嘛?
2004-11-30 11:01:00 | [匿名用户:chuanzai]
#re: Guid 和 Int 作为系统编号的取舍 编辑
int肯定不会重复
guid会不会重复?
2004-11-30 10:28:00 | [匿名用户:chuanzai]
#re: Guid 和 Int 作为系统编号的取舍 编辑
数据量大的话用guid是一个不错的选择,生成guid的过程可以放在数据库端。
2004-11-30 10:08:00 | [匿名用户:SpiderMan]
#re: Guid 和 Int 作为系统编号的取舍 编辑
使用Guid还有一个小小的好处就是可以增加一点点
数据被 蜘蛛/小偷程序读取的难度
最起码不能很简单的 按照开始编号和结束编号就去盗了
2004-11-30 09:45:00 | [匿名用户:活靶子的靶子]
#re: Guid 和 Int 作为系统编号的取舍 编辑
如果你的程序是使用SmartPhone/PocketPC,很不幸,不支持GUID的生成。
2004-11-30 09:31:00 | [匿名用户:开心就好]
#re: Guid 和 Int 作为系统编号的取舍 编辑
另外关于guid的优点,我也一并摘录:

1。复制使用guid主键的数据库时,不必做额外的检查
2。guid值的随机性可以减少数据库的热点
3。guid可以避免用户使用具有实际意义的主键
4。guid可以避免连接这样的错误,即,查询时连接了错误的表,但系统依旧返回了结果。
5。guid的值是用不完的
6。可以使用多种方式来生成guid值
2004-11-30 08:36:00 | [匿名用户:王勇]
#re: Guid 和 Int 作为系统编号的取舍 编辑
你的guid在哪里生成?
2004-11-30 08:31:00 | [匿名用户:jiezhi]
#re: Guid 和 Int 作为系统编号的取舍 编辑
当然,前提是数据量较大的时候,至少数千个select语句。

2004-11-30 08:29:00 | [匿名用户:王勇]
#re: Guid 和 Int 作为系统编号的取舍 编辑
整数比GUID快10%到33%------〉〉摘自SQL Server2000 宝典
2004-11-30 08:27:00 | [匿名用户:王勇]
#re: Guid 和 Int 作为系统编号的取舍 编辑
BizTalk是做EAI的,涉及到多个互不相连的系统,所以使用GUID.
2004-11-29 17:31:00 | [匿名用户:开心就好]
#re: Guid 和 Int 作为系统编号的取舍 编辑
想知道“Guid 虽然在搜索、索引寻找的时候,速度肯定比不上Int型字段。”
他们的性能到底差多少呢?是不是一个可以接受的数量级呢?
2004-11-29 17:28:00 | [匿名用户:WingFeng]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.0