手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2010年01月4日的文章

又见使用Guid做主键和int做主键性能比较的文章

关于使用GUID和INT做主键,性能差异的文章历来很多,不过。大多都是从理论上来说明,这次难得看到某人用PC机做测试,所以贴上来看看。但我不贴全文,毕竟。。。大量的代码贴上来,也没有太大的意义 。所以仅贴上主体内容和测试结果,当然还会有一些用户的评论。。

原文网址为:http://www.cnblogs.com/jackhuclan/archive/2010/01/04/1639005.html
内容大致如下,【如想看全文,请使用上面的链接】
在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法说明道理。碰巧今天在数据库的优化过程中,遇到此问题,于是做了一下测试。

 

测试环境:

  台式电脑 Pentiun(R) 4 Cpu 3.06GHz
Win XP professional
1.5G DDR RAM
SQL Server 2005 个人版 

测试过程:
首先创建测试数据库Test
1.创建Test_Guid表,创建Test_Int表
2.创建Test_Guid子表:Test_Guid_Detail和创建Test_Int子表:Test_Int_Detail,用来做连接查询
3、然后进行一些CRUD的操作【这是我写的,因为原文中写插入N行数据,删除N行数据之类的太复杂,也太多,简化为一句话了】

测试结果如下
大小: 50.14 K
尺寸: 326 x 376
浏览: 1680 次
点击打开新窗口浏览全图

综上所述,使用int做主键比用guid做主键各中情况下效率均有提高,特别是在有连接查询和删除记录效率提升明显。

而且本人今日在guid做主键的数据查询中因为嵌套几个子查询结果屡屡出现查询超时。因此本人赞同用int做主键,不赞同guid做主键。
以上观点代表个人观点,欢迎大家各抒己见,说明guid和int各自做主键的优劣所在。

----EOF---

本来到这里就可以结束了,但有一个用户的评论还算不错:

徐少侠
  1. 首先  
  2. 10万行不算大数据量  
  3. 我测试插入操作的时候是1600万行。性能约有10-20%的差异  
  4. 当然,10万行也能说明一些问题了  
  5.   
  6. 其次,请在所有的where和on条件中使用到的列身上增加一个索引  
  7. 也就是说所有的外键都要有索引,非唯一索引  
  8. 具体说,就是主表的TestId以及子表对应的外键列  
  9.   
  10. 然后再重新执行一下上述测试  
  11. 主要对带where和inner join的测试表示疑问  
  12.   
  13. 最后,int在多数情况下一定比Guid快,这是不用怀疑的。  
  14. 同时,查询优化主要靠索引,以及对索引树的优化以及查询顺序的安排  
  15. 主键的数据类型一般只影响到插入操作的速度  
  16. 对于查询操作的影响是比较小的  
  17. 不至于出现50%左右的性能差异  

更多的人认为GUID在做数据迁移的时候很方便,而如果使用INT则会有意料不到的问题。而GUID遇到的问题会少很多。。。

相对于以上的观点我还是比较认同的,但我认为性能相差这么大是有可能有以下的原因:
1、作者用的是PC机
2、操作系统是XP
3、sql server 是个人版【我没有试用服务器版性能如何,但我想,一定比个人版性能更优,当然这是猜测】

说归说,对于MYSQL来说,基本上还是只能使用INT做主键。毕竟MYSQL没有自带的生成GUID的方法【我不是指手动生成,我是说自动生成。。。UUID()函数是可以生成GUID的,但不能象INT那样自动插入,也没有办法设置default为UUID()方法】

Tags: guid, int

ThinkSNS 插件配置BUG

由于最近一直在使用thinksns,所以相对关注的就比较多了一点。BUG偶尔也会发现一些,小的就不提了,没意义,偶尔也有可能是手误的关系,但一些稍大一点的。我还是写下来做个记录。。

比如这个插件配置的BUG。

一般来说,项目的配置要覆盖原始配置都是array_merge就结束了。于是乎,ThinkSNS在每个插件的Conf目录下的Config文件里也都有这么一行。

然而。。。问题就出来这里,插件的作者好象都没有注意过Array_merge的作用范围。

大多情况都是这样写的:

PHP代码
  1. $miniConfig = array (  
  2.     'DEBUG_MODE'        =>  false,  
  3.     'DEFAULT_ACTION'    =>   'index',  
  4. );  
  5. $array = require_once( SITE_PATH.'/config.inc.php' );  
  6. $array = array_merge$miniConfig,$array );  
OK,让我们来温习一下array_merge函数。
XML/HTML代码
  1. array_merge() merges the elements of one or more arrays together so that the values of one are appended to the end of the previous one. It returns the resulting array.   
  2.   
  3. If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended.   
  4.   
  5. If only one array is given and the array is numerically indexed, the keys get reindexed in a continuous way.   

看到第二段没?如果有相同的KEY,后面的会覆盖前面的。。那么。。上面第6行的array_merge,和没运行有什么区别???

把参数顺序颠倒一下就OK了。。。