`
java-mans
  • 浏览: 11529762 次
文章分类
社区版块
存档分类
最新评论

有无主键的数据库设计 百万数据测试

 
阅读更多

分析数据库主键设定对查询效率的影响
2011-1-13 来源:cnblog 作者:kuyijie 我要评论 分享到: 博客引用 投稿 打印 大 | 中 | 小导读:本文分析了在进行数据库设计时,主键的选择对数据库查询效率的影响。

关键词:数据库设计 主键 GUID INT 数据库查询
  在数据库表设计时,许多人为采用INT类型还是GUID(uniqueidentifyer)作为主键争论不休,有认为int型字段好的,有认为GUID好的,很多时候的焦点集中在效率上。

  为了弄清事实真相,我想还是要以实验来进行测试为准。以下就是为了测试插入效率而写的一段脚本。测试环境是:Xeon 1.6/2G内存 win2003/sqlserver2005 企业版。

  测试脚本:

  --测试无主键/Identity/Uniqueidentifier/varchar类型主键插入表时的效率

  set nocount on
declare @now datetime,@i int
set @i=1
set @now=getdate()
Create table test1(nopkey int,col uniqueidentifier )
while @i<10000000
Begin
insert into test1 values (1,newid())
set @i=@i+1
end
Print'新表无主键插入100万条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

set @i=1
set @now=getdate()
while @i<10000
Begin
insert into test1 values (1,newid())
set @i=@i+1
end
Print'100万行中再插入10000条数据时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

GO
Create table Test2(pkey int identity(1,1) primary key , col uniqueidentifier default(newid()))
declare @now datetime,@i int
set @i=1
set @now=getdate()
while @i<1000000
Begin
insert into test2(col) values (newid())
set @i=@i+1
end
Print '新表以int为主键插入100万条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

set @i=1
set @now=getdate()
while @i<10000
Begin
insert into test2(col) values (newid())
set @i=@i+1
end
Print'100万行中再插入10000条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'
GO

Create table test3(Pkey uniqueidentifier Primary key, col int)
declare @now datetime,@i int
set @i=1
set @now=getdate()
while @i<1000000
Begin
insert into test3 values (newid(),3)
set @i=@i+1
end

Print '新表以uniqueidentifier主键插入100万条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

set @i=1
set @now=getdate()
while @i<10000
Begin
insert into test3 values (newid(),3)
set @i=@i+1
end
Print'100万行中再插入10000条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

GO

Create table test4(Pkey varchar(36) Primary key, col int)
declare @now datetime,@i int
set @i=1
set @now=getdate()
while @i<1000000
Begin
insert into test4 values (convert(varchar(36),newid()),3)
set @i=@i+1
end
Print '新表以varchar(36)类型为主键插入100万条数据:所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'


set @i=1
set @now=getdate()
while @i<10000
Begin
insert into test4 values (convert(varchar(36),newid()),3)
set @i=@i+1
end
Print'100万行中再插入10000条数据所耗时间:'+convert(varchar(200),datediff(ms,@now,Getdate()))+'毫秒'

GO
drop table test1
drop table test2
drop table test3
drop table test4


  运行测试结果如下:

  新表无主键插入100万条数据所耗时间:1212856毫秒

  100万行中再插入10000条数据时间:19360毫秒

  新表以int为主键插入100万条数据所耗时间:111623毫秒

  100万行中再插入10000条数据所耗时间:1110毫秒

  新表以uniqueidentifier主键插入100万条数据所耗时间:118753毫秒

  100万行中再插入10000条数据所耗时间:1153毫秒

  新表以varchar(36)类型为主键插入100万条数据所耗时间:132830毫秒

  100万行中再插入10000条数据所耗时间:1263毫秒

经过多次测试,均为相应结果,可见在插入表时,对于无主键和有主键的表来说,无主键的表其插入效率最低,其次是Varchar,uniqueidentifierint 从测试结果看,int类型和uniqueidentifier类型的插入时间相差无几,在2005下如果插入一两条记录的情况下应该是没有什么影响,而采用uniq这种类型的字段,在编程取ID和转移数据方面有着很大的优势,至于它占用空间比int类型要多一些,这对于本身就是超大的数据库而言应该不是太大问题。

  

另外一人提供的数据:

  统计:

  新表无主键插入100万条数据所耗时间:2397270毫秒

  100万行中再插入10000条数据时间:2420毫秒

  查询数据所耗时间:79980毫秒

  统计数据所耗时间:690毫秒

  新表以int为主键插入100万条数据所耗时间:195570毫秒

  100万行中再插入10000条数据所耗时间:1760毫秒

  查询数据所耗时间:7866毫秒

  统计数据所耗时间:110毫秒

  新表以uniqueidentifier主键插入100万条数据所耗时间:207506毫秒

  100万行中再插入10000条数据所耗时间:2410毫秒

  查询数据所耗时间:7696毫秒

  统计数据所耗时间:76毫秒

  新表以varchar(36)类型为主键插入100万条数据:所耗时间:227616毫秒

  100万行中再插入10000条数据所耗时间:2250毫秒

  查询数据所耗时间:9416毫秒

  统计数据所耗时间:93毫秒

  以上是别人提供的数据,经过我的测试(我的机子为2.8GHZ,内存为1G)数据如下:

  以GUID作主键时:

  以uniqueidentifier主键插入100万条数据所耗时间:800123毫秒

  100万行中再插入10000条数据所耗时间:7970毫秒

  以Int型作主键时:

  所耗时间:

  新表以int为主键插入100万条数据所耗时间:1067796毫秒

  100万行中再插入10000条数据9360毫秒

  查询时:

  declare @startTime datetime
set @startTime=getdate()
select * from test3
select datediff(second,@startTime,getdate())as秒,datediff(ms,@startTime,getdate())as毫秒


  查询所有时(101000000条):

  用GUID 作主键时:

  秒 毫秒

  130 130876

  用INT 作主键时:

  秒 毫秒

  141 140626

  当查询一条时,测试不出来,结果均为0毫秒。


TechTarget中国原创内容,原文链接:http://www.searchdatabase.com.cn/showcontent_44767.htm

分享到:
评论

相关推荐

    数据库主键设计原则 设计数据库主健

    数据库主键设计原则:我在设计主键,会采用字符型的.不采用自动递增,在新增记录时,系统生成主键值.一般为全数字进行存入,至于主键值的生成规则,可以按需求进行规则定义.如果没有特殊的要求,只是为了保持唯一...

    数据库主键的五种设计方法

    介绍数据库中主键设计的方法,以及各种方法的优点和缺陷。希望大家喜欢

    数据库主键和外键设计的原则.doc

    数据库主键和外键设计的原则

    获取数据库所有主键获取数据库所有主键

    获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键

    数据库主键设计之思考

    在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来。

    数据库主键 (数据完整性)

    数据库完整性详解,十分详细,附有详细上机图以及步骤。

    数据库中表的主键设计原则收藏.doc

    数据库中表的主键设计原则收藏

    数据库设计文档.pdf

    本文档是人资信息管理系统数据库设计文档,主要对软件后台数据库的概念模型设计和物理模型设计作出了统一的规定,同时确定了每个表的数据字典构造。该文档是开发人员、测试人员编码及测试的重要参考依据。 数据库...

    MySQL数据库主键重复原因分析及处理.pdf

    MySQL数据库主键重复原因分析及处理.pdf MySQL数据库主键是数据库管理系统中的一种...MySQL数据库主键是关系型数据库设计的核心概念,它可以保证数据的唯一性和完整性。但是,主键重复的问题也需要引起注意和解决。

    CMS数据库设计说明书.docx

    * 数据表设计:数据表设计是指数据库中的数据表结构设计,包括字段、数据类型、约束等。 * 视图设计:视图设计是指数据库中的视图结构设计,包括视图的名称、字段、数据类型等。 * 存储过程设计:存储过程设计是指...

    分布式数据库唯一主键设计

    分布式数据库唯一主键设计

    NBA球员数据管理系统数据库课程设计

    NBA球员数据管理系统数据库课程设计 本文旨在设计一个NBA球员数据管理系统的数据库课程设计,旨在帮助学生学习数据库管理系统的设计和实现。该系统主要包括球员信息管理、比赛记录管理、球队管理等功能模块,以满足...

    1、mysql数据同步到redis 2、redis里面主键的设计、3、redis和数据库之间的数据同步

    1、mysql数据同步到redis 2、redis里面主键的设计、3、redis和数据库之间的数据同步 1、mysql数据同步到redis 2、redis里面主键的设计、3、redis和数据库之间的数据同步

    数据库设计培训.pptx

    良好的数据库设计: 节省数据的存储空间 能够保证数据的完整性 方便进行数据库应用系统的开发 糟糕的数据库设计: 数据冗余、存储空间浪费 内存空间浪费 数据更新和插入的异常 数据库设计培训全文共37页,当前为第3...

    城市公交系统数据库设计.doc

    针对这 一问题,以德州为例,对基于SuperMap面向对象的空间数据模型,结合SQL server 2005数据库技术,进行了德州市公交系统数据库设计,为公交车的路线决策提供数据支 持。 关键字:数据库;数据模型;公交系统;...

    数据库设计PPT课件.pptx

    数据库设计ppt课件 本节课件主要介绍数据库设计的基本步骤,包括标识实体、绘制E-R图、将E-R图转换为数据表三个步骤。...* 不好的数据库设计可以导致数据库性能下降、数据不安全和数据不一致的问题。

    mysql数据库程序设计练习题.docx

    该资源涵盖了数据库系统的核心、SQL语言的功能、关系数据库设计、事务控制、数据一致性、安全性等多方面的知识点。 数据库系统的核心 数据库系统的核心是数据库管理系统(DBMS),它是管理和控制数据库的软件系统...

    OA数据库设计.docx

    OA数据库设计 OA数据库设计文档 1、用户信息表(UserInfo) 字段名称 字段含义 字段大小 是否为空 是否外键 说明 UserId 用户id Integer 否 否 主键自增 UserName 用户名 Varchar(50) 否 否 用户名 PassWord 密码 ...

    自己动手设计数据库

    《自己动手设计数据库》主要讲述数据库的设计,讨论了如何建立表结构、确定主键、设置字段说明、建立表关系、确立业务规则、建立视图和各层次的数据完整性,以及如何避免不好的设计等问题。《自己动手设计数据库》...

    1数据库设计规范.doc

    提高数据库设计的合理性和数据访问高效性,同时便于阅 读和理解数据库的结构,以提高数据共享的质量和效率,促进数据库编码的标准化,特 制订一套数据库设计规范。 设计规范 1 规范约定 遵守数据的设计规范3NF 规定 ...

Global site tag (gtag.js) - Google Analytics