数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2209|回复: 0

:《高性能的数据库》第三讲 设计细节

[复制链接]
发表于 2004-5-7 18:11:30 | 显示全部楼层 |阅读模式
<FONT size=3>《高性能的数据库》第三讲 设计细节
--------------------------------------------------------------------------------
时间:2003-10-11 16:00:14

《高性能的数据库》第三讲 设计细节

第三讲 设计细节

到现在已经是第三讲了,也不知道听众几何……说得好的话,送之鲜花,说得不好的话,丢个鸡蛋把!好歹也让我chair3知道有几个人听了。
好,废话少说,now begin:

要点:


  1、约束
  2、默认值
  3、计算字段
  4、索引


以上乃数据库设计以及编程的最常用的部分了,下面听我一一将来


1、约束。  

   约束?何为约束?也就是对某一字段数值限定。以维护数据库数据的最党的纯洁性。一流的程序员打一开始,就应当知道某一字段的填写范围。
算了,理论不说了,举例子:

   Create Table People (
      Name   varchar(20) Not Null,  --姓名
      Age    int Not Null  Check(Age&gt;0)  --年龄
   )


大伙看了      Age    int Not Null  Check(Age&gt;0)     ,中的Check(Age&gt;0)就是防止用户不小心填写入&lt;0的数值。哈哈,难道娘胎里的就算是-1岁么?
显然国务院没有如此规定。因此必须强迫Age&gt;0。

2、默认值。

   什么叫默认值不用我说了。数据表设计中,尽量避免Null的字段。采用默认值。

   还是举例子有说服力!看:

   Create Table People (
      Name   varchar(20) Not Null,  --姓名
      Sex    bit Not Null Default 1, --性别
      Age    int Not Null  Check(Age&gt;0)  --年龄
   )


看到了没?      Sex    bit Not Null Default 1  ,性别,也就“男”或者“女”,用数字表示也就1 or 0 。在防止数据字段出现更多的情况(比如null),就必须使用not null。
照顾很多懒虫一般的客户(好像是说自己了),就给他默认一个“男”好了!唉,毕竟男女不打平等,很多地方都是男得多。(痛苦中…)
这里仅仅是举个例子,很多地方都可以用得到,比如日期之类的。请尽量避免 null,而采用not null + default 能够更为纯洁你的数据库。


3、计算字段

   优秀的设计人员,一开始就应当知道如何考虑到以后的使用的问题。比如在一个学生的表中(我这里是举个例子,实际上我不会写死subject的数量的)
   
  Create Table Student(
    StudentID int primary key ,
    ...

    Chinese  Float not null default 0,
    English  Float not null default 0,
    Mathematics Float not null default 0
   
    Sum      As  Chinese+English+Mathematics,
    Average  As (Chinese+English+Mathematics)/3,
   ....
  )

相信 这里聪明的人甚多,这个说些什么好呢?  肚子有点饿…… 坚持一下,写完第4点马上作饭吃!

4、索引
  
   这可是这里设计中的最最最最最最最最最最最最最最最最最最最最重要的部分!!
   数据库的性能取决于索引的设计的好坏。
   俺先给大家大致讲讲索引的种类:聚类索引,非聚类索引(Clustered Index and nonClustered index)

   聚类索引通常创建于主键,主要创建于这些字段
    1、主键、外建
    2、返回某范围的数据
    等等

   非聚类索引通常用于
    1、乱糟糟的数据,很多都不一样D
    2、而且数据经常要更改D


   这样说大家似乎都不是很明白吧?

   来吧,来吧,相约DevClu吧!

   Create Table OperateRecord  (  --操作记录

       OperateRecordID  int primary key,     --流水号
       OperatorID         int not null,       --操作员ID
       Operation         varchar(100),        --操作内容
       OperateDate       DAteTime,            --时间
       Memo             varchar(30)           --备注
    )


   比如,在这里,如果经常要求对该操作员进行查询,那么OperatorID就应该采用聚类索引,如果还经常对操作内容进行查询,那么Operation就应该采用非聚类索引。

   于是:
    Create UNIQUE CLUSTERED Index idxOperateRecord_OperateREcordID On OperateRecord(OperateREcordID)
    Go
    Create  Index idxOperateRecord_Operation On OperateRecord(Operation)
    Go

    使用索引:

    Select *
      From OperateRecord With(Index=(idxOperateRecord_OperateREcordID))  --指定索引查询
      Where OperateRecordID   between 1 and 20000                        --条件是OperateRecordID .
      order by OperateRecordID  


   大家看明白了否?我肚子很饿了,没力气说了 <IMG src="http://www.beincity.net/stu/cdb/images/smilies/sad.gif" align=absMiddle border=0><IMG src="http://www.beincity.net/stu/cdb/images/smilies/sad.gif" align=absMiddle border=0>
   
   试验证明,优秀的索引 将大大提高查询的速度.

   chair3以前曾经作个一个例子:
   
              pIII (好像是500),128M Ram ,Win2K Server, SQLServer Enterprise
              
              History表为 1000万的数据。
               1、使用聚类索引,我提取100万,耗时1分钟;提取1条,耗时2秒 (我可能记错了,可能不用2秒的…我现在的机器都是一瞬间就提取出来了,不过我现在用P4,512内存。数据为1800万)
               2、不使用任何索引(我把索引删掉),提取1条记录,耗时55秒;提取100万数据………我不敢,我怕死机。
   
   
   当然也不是索引越多越好,索引越多,将会影响写的速度。一般说,一个表,有2-3个索引即可。根据实际情况。


   不说了,饿死了! 作饭去!

   看了好歹回我一个帖子,无论好与坏。</FONT>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 08:33 , Processed in 0.047751 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表