设计高性能数据库[优化数据库结构]

来源:互联网 发布:php 替换回车符 编辑:程序博客网 时间:2024/04/28 09:56
下载地址: http://download.csdn.net/detail/jiangtongcn/4121176

优化结构的方式

       分离用户数据库与系统数据库

       创建数据库表分区

       创建垂直分表

       创建水平分表

数据库对象的部署

      混合放置的缺点

              在我们创建数据库的时候,一般来说用户数据库默认路径和系统数据库是放在一起的,这种部署方式有严重问题:假如有一个第三波书店的数据库,用户对它频繁访问,数据库所在的磁盘吞吐量已经接近极限,那么这个时候系统表就没有更多的资源来使用,就可能导致长时间的排队或者死锁。为了减少多个表之间的资源争夺可以把多个数据库对象分开放在不同的磁盘上。也就是实现分离用户数据库和系统数据库

clip_image002

      分离用户数据库与系统数据库【降低资源竞争】

              减少资源竞争

                     尽量避免数据死锁

              如果数据库已经创建推荐以下实践步骤:

1.      分离数据库

2.      找到分离后的数据文件和日志文件,分表将日志文件和数据文件复制到不同磁盘的目录下

3.      附加移位后的数据库文件还原数据库

文件和文件组

       文件和文件组允许跨磁盘、磁盘控制器、RAID创建数据库

       比如计算上有四个物理磁盘,那么可以创建一个由三个数据文件和一个日志文件组成的数据库,这样在对数据进行访问的时候四个读写的磁头可以同时并行地访问数据,从而加快数据库操作速度。

clip_image004

文件和文件组还允许数据布局,可以在特定的文件组上创建表,这样可以改善性能

我们可以将特定的表所有的IO都定向到一个特定的磁盘,那么如何在文件组上见表?

       语法:

              CREATE TABLE [表名]

              (

                     --表字段1

                     --表字段2

              ) ON [PRIMARY/文件组名]

创建垂直分表

      将大型表从字段上分,这叫垂直分表

      垂直分表通常是将大型表的大文本字段从原表分离【将大文本字段分离后原来的数据页上每页可以存储更多的数据】,然后存储在其它表中

       例如从图书表中将ContentDescriptionTOC字段分离出来放在单独的表中,这两个字段是nvarchar(max)类型

clip_image006

垂直分表代码示范:

---分离大文本字段

SELECT A.ContentDescription,A.TOC,A.Id

INTO Book_detail

FROM Book A

---从原表中删除原来的大文本字段

ALTER TABLE BOOK

DROP COLUMN CONTENTDESCRIPTION

 

ALTER TABLE BOOK

DROP COLUMN TOC

 

 

创建水平分表

       将大型表从数据类别上或者时间字段上分,这叫水平分表

       水平分表通常做法比较多,根据不同的业务需求有不同的划分

clip_image008

水平分表示范:

       SELECT

       INTO

       BOOK_2008

       FROM BOOK

       WHERE PUBLISHERDATE>='2008-1-1' AND PUBLISHDATE<'2009-1-1'

 

       SELECT

       INTO

       BOOK_2009

       FROM BOOK

       WHERE PUBLISHERDATE>='2009-1-1' AND PUBLISHDATE<'2010-1-1'

 

       SELECT

       INTO

       BOOK_2010

       FROM BOOK

       WHERE PUBLISHERDATE>='2010-1-1' AND PUBLISHDATE<'2011-1-1'

 

注意:事前良好的数据库设计【预计数据规模负荷有多大决定是否采用水平分表】胜过事后进行水平分表【事后分表可能引起程序较大改动】。

原创粉丝点击