你的位置:首页 > 数据库

[数据库]Atitit.数据库分区的设计attilax总结


Atitit.数据库分区的设计 attilax  总结

 

1. 分区就是分门别类的文件夹 (what)1

2. 分区的好处(y)1

3. 分区原则(要不要分区,何时分区)how2

4. 主要的分表类型有range,list,hash,key等2

5. 水平分区(Horizontal Partitioning) 垂直分区(Vertical Partitioning)3

6. 分区的操作4

7. 分区理论  并行数据库的体系结构4

8. 参考7

 

1. 分区就是分门别类的文件夹 (what)

分区的原理

分区的基本原理就是通过访问一个表或者索引的较小片断,而不是访问整个表和索引,以提高数据库的性能。如果将一个表的不同分区放置在不同的磁盘上,磁盘整体的吞吐量就会成倍上升。

 

 

2. 分区的好处(y)

 

在一个表的数据超过过2000万条或占用2G空间时,建议建立分区表

 

分区使得数据管理操作如数据装载、索引建立和重建、备份和恢复等在分区级别上完成,这比在表级完成操作要明显的节省时间;

分区可以提高性能,在很多情况下,查询可以通过扫描某个分区来完成,而不是去扫描整个表;

 

根据查询条件自动将扫描范围缩小到一个或几个表(索引)分区上。这种方式其实是分区扫描替代了全表扫描。

 

如果连接查询的两张表都在连接列上进行分区,则 会优化连接操作,将一个大的连接分成各个对应分区间的连接,而且这些分区连接操作还可以并行执行。

并行DML:采用并行执行,可以使操作并行在各个分区上同时执行,从而提供执行效率。

 

 

 

 

 

3. 分区原则(要不要分区,何时分区)how

    考虑对表是否需要分区时,可以从以下几个方面判断。不过这也只是经验之谈。仅供参考。

    1表的大小。对于大表进行分区,有益于大表操作的性能和大表的数据维护。通常,当表大小超过1.5G,对于OLTP系统表记录超过1000万,都应该考虑分区。

    2数据的访问特性。基于表的大部分查询应用,只访问表中的少量数据。对于这样的表进行分区,可以排除无关数据查询的特性。

    3数据维护。某些表的数据维护,经常按时间段删除成批的数据,例如按月删除历史数据,对有这样需要的表进行分区。以满足维护需要,因为delete大量数据,对系统开销很大,有时甚至是不可接受的。

    4只读数据。如果一个表中大部分数据都只是只读数据,通过对表进行分区,可将只读数据存储在只读表空间中,对于数据库的备份是十分有益的。

    5并行数据操作。对于经常执行并行操作的表,应考虑分区。

    6表的可用性。对表的某字段或者某段数据可用性要求很高时,应考虑分区。

 

4. 主要的分表类型有range,list,hash,key等

具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份

Range分区是用的最多的方式

 

这可能是Oracle中最常用的分区机制。适用于数值型或日期型。如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中,并且支持指定多列做为依赖列

 

 LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

 

 列表分区:指定一个离散值集,来确定应当存储在一起的数据。例如,可以指定STATUS列值在(’A’,’M’,’Z’ )中的行放在分区1中,STATUS值在( ‘D’,P’,’Q’ )中的行放在分区2中,依此类推。列表分区和范围分区的不同主要是列表分区按照预先给定的一系列离散值进行分区,新数据插入表中时,根据分区键值找到对应分区。列表分区的分区列只有一个,当然其单个分区对应值可以使多个。在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区,存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。语法是:partition by list()。例如:

 

 

 KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。

 

 

复合分区:是范围分区和散列分区或列表分区混合使用的一种分区方法。复合分区在分区上用的是范围分区,在每个分区上又可以使用列表分区或散列分区的方法分成多个子分区。语法是:partition by range() subpartition by hash()

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

 

5. 水平分区(Horizontal Partitioning) 垂直分区(Vertical Partitioning)

 

 

分区主要有两种形式://这里一定要注意行和列的概念(row是行,column是列)

水平分区(Horizontal Partitioning)

这种形式分区是对表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。

举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录。(朋奕注:这里具体使用的分区方式我们后面再说,可以先说一点,一定要通过某个属性列来分割,譬如这里使用的列就是年份)

垂直分区(Vertical Partitioning)

这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。

举个简单例子:一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

在数据库供应商开始在他们的数据库引擎中建立分区(主要是水平分区)时,DBA和建模者必须设计好表的物理分区结构,不要保存冗余的数据(不同表中同时都包含父表中的数据)或相互联结成一个逻辑父对象(通常是视图)。这种做法会使水平分区的大部分功能失效,有时候也会对垂直分区产生影响。

 

 

6. 分区的操作

 

 

7. 分区理论  并行数据库的体系结构

 

.1、并行数据库的体系结构
并行机的出现,催生了并行数据库的出现,不对,应该是关系运算本来就是高度可并行的。对数据库系统性能的度量主要有两 种方式:(1)吞吐量(Throughput),在给定的时间段里所能完成的任务数量;(2)响应时间(Response time),单个任务从提交到完成所需要的时间。对于处理大量小事务的系统,通过并行地处理许多事务可以提高它的吞吐量。对于处理大事务的系统,通过并行 的执行事务的子任务,可以缩短系统晌应时间。
并行机有三种基本的体系结构,相应的,并行数据库的体系结构也可以大概分为三类:
l    共享内存(share memeory):所有处理器共享一个公共的存储器;
l    共享磁盘(share disk):所有处理器共享公共的磁盘;这种结构有时又叫做集群(cluster);
l    无共享(share nothing):所有处理器既不共享内存,也不共享磁盘。
如图所示:

1.1.1、    共享内存
该 结构包括多个处理器、一个全局共享的内存(主存储器)和多个磁盘存储,各个处理器通过高速通讯网络(Interconnection Network)与共享内存连接,并均可直接访问系统中的一个、多个或全部的磁盘存储,在系统中,所有的内存和磁盘存储均由多个处理器共享。
这种结构的优点在于,处理器之间的通信效率极高,访问内存的速度要比消息通信机制要快很多。这种结构的缺点在于,处理器的规模不能超过32个或者64个,因为总线或互边网络是由所有的处理器共享,它会变成瓶颈。当处理器数量到达某一个点时,再增加处理器已经没有什么好处。
共享内存结构通常在每个处理器上有很大的高速缓存,从而减少对内存的访问。但是,这些高速缓存必须保持一致,也就是缓存一致性(cache-coherency)的问题。
1.1.2、    共享磁盘
该结构由多个具有独立内存(主存储器)的处理器和多个磁盘存储构成,各个处理器相互之间没有任何直接的信息和数据的交换,多个处理器和磁盘存储由高速通信网络连接,每个处理器都可以读写全部的磁盘存储。
共享磁盘与共享内存结构相比,有以下一些优点:(1)每个处理器都有自己的存储器,存储总线不再是瓶颈;(2)以一种较经济的方式提供了容错性(fault tolerence),如果一个处器发生故障,其它处理器可以代替工作。
该结构的主要问题不是在于可扩展性问题,虽然存储总线不是瓶颈,但是,与磁盘之间的连接又成了瓶颈。
运行Rdb的DEC集群是共享磁盘的体系结构的早期商用化产品之一(DEC后来被Compaq公司收购,再后来,Oracle又从Compaq手中取得Rdb,发展成现在的Oracle RAC)。
1.1.3、    无共享
该结构由多个完全独立的处理节点构成,每个处理节点具有自己独立的处理器、独立的内存(主存储器)和独立的磁盘存储,多个处理节点在处理器级由高速通信网络连接,系统中的各个处理器使用自己的内存独立地处理自己的数据。
这 种结构中,每一个处理节点就是一个小型的数据库系统,多个节点一起构成整个的分布式的并行数据库系统。由于每个处理器使用自己的资源处理自己的数据,不存 在内存和磁盘的争用,提高的整体性能。另外这种结构具有优良的可扩展性——只需增加额外的处理节点,就可以以接近线性的比例增加系统的处理能力。
    这种结构中,由于数据是各个处理器私有的,因此系统中数据的分布就需要特殊的处理,以尽量保证系统中各个节点的负载基本平衡,但在目前的数据库领域,这个数据分布问题已经有比较合理的解决方案。
由于数据是分布在各个处理节点上的,因此,使用这种结构的并行数据库系统,在扩展时不可避免地会导致数据在整个系统范围内的重分布(Re-Distribution)问题。
    Shared-Nothing结构的典型代表是Teradata(并行数据库的先驱),值得一提的是,MySQL NDB Cluster也使用了这种结构。

 1.2、I/O并行(I/O Parallelism)
I/O并行的最简单形式是通过对关系划分,放置到多个磁盘上来缩减从磁盘读取关系的时间。并行数据库中数据划分最通用的形式是水平划分(horizontal portioning),一个关系中的元组被划分到多个磁盘。
1.2.1、常用划分技术
假定将数据划分到n个磁盘D0,D1,…,Dn中。
(1)    轮转法(round-bin)。对关系顺序扫描,将第i个元组存储到标号为Di%n的磁盘上;该方式保证了元组在多个磁盘上均匀分布。
(2)    散列划分(hash partion)。选定一个值域为{0, 1, …,n-1}的散列函数,对关系中的元组基于划分属性进行散列。如果散列函数返回i,则将其存储到第i个磁盘。
(3)    范围划分(range partion)。
由于将关系存储到多个磁盘,读写时能同时进行,划分(partion)能大大提高系统的读写性能。数据的存取可以分为以下几类:
(1)    扫描整个关系;
(2)    点查询(point query),如name = “hustcat”;
(3)    范围查询(range query),如 20 < age < 30。
不同的划分技术,对这些存取类型的效率是不同的:
u    轮转法适合顺序扫描关系,对点查询和范围查询的处理较复杂。
u    散列划分特别适合点查询,速度最快。
u    范围划分对点查询、范围查询以及顺序扫描都支持较好,所以适用性很广。但是,这种方式存在一个问题——执行偏斜(execution skew),也就是说某些范围的元组较多,使得大量的I/O出现在某几个磁盘。

 

 

8. 参考

数据库分区_百度百科.htm

Mysql数据库分区 - xyliufeng的日志 - 网易博客.htm

理解MySQL——并行数据库与分区(Partition) - YY哥 - 博客园.htm

创建,增加,删除mysql表分区 - ndwx228的个人空间 - 开源中国社区.htm

数据库学习之分区技术_Doraemonls_新浪博客.htm