《高性能的数据库》三
第三讲 设计细节
到现在已经是第三讲了,也不知道听众几何……说得好的话,送之鲜花,说得不好的话,丢个鸡蛋把!好歹也让我chair3知道有几个人听了。
好,废话少说,now begin:
要点:
约束
默认值
计算字段
索引
以上乃数据库设计以及编程的最常用的部分了,下面听我一一将来
1、约束。
约束?何为约束?也就是对某一字段数值限定。以维护数据库数据的最党的纯洁性。一流的程序员打一开始,就应当知道某一字段的填写范围。
算了,理论不说了,举例子:
Create Table People (
Name varchar(20) Not Null, --姓名
Age int Not Null Check(Age>0) --年龄
)
大伙看了 Age int Not Null Check(Age>0) ,中的Check(Age>0)就是防止用户不小心填写入<0的数值。哈哈,难道娘胎里的就算是-1岁么?
显然国务院没有如此规定。因此必须强迫Age>0。
2、默认值。
什么叫默认值不用我说了。数据表设计中,尽量避免Null的字段。采用默认值。
还是举例子有说服力!看:
Create Table People (
Name varchar(20) Not Null, --姓名
Sex bit Not Null Default 1, --性别
Age int Not Null Check(Age>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
大家看明白了否?我肚子很饿了,没力气说了 :(:(
试验证明,优秀的索引 将大大提高查询的速度.
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个索引即可。根据实际情况。