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://blog.csdn.net/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

Atitit.数据库分区的设计 attilax  总结的更多相关文章

  1. Atitit.常用分区api的attilax总结

    Atitit.常用分区api的attilax总结 1. Api 来源与oracle与mysql1 1.1. 分区定义partition by range (uid)  使用VALUES LESS TH ...

  2. Atitit.数据库事务隔离级别 attilax 总结

    Atitit.数据库事务隔离级别 1. 事务隔离级别的作用 1 2. 在的隔离级别 2 3. 常见数据库的默认管理级别 3 1. 事务隔离级别的作用 较低的隔离级别可以增强许多用户同时访问数据的能力, ...

  3. Atitit.数据库表的物理存储结构原理与架构设计与实践

    Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...

  4. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  5. Atitit 修改密码的功能流程设计 attilax总结

    Atitit 修改密码的功能流程设计 attilax总结 1.1. 注意点1 1.2. 设计修改用户密码功能时把用户ID保存在哪里?1 1.3. Ui设计1 1.4. 功能设计源码1 1.5. Agt ...

  6. Atitit 通用接口的设计与实现attilax 总结

    Atitit 通用接口的设计与实现attilax 总结 1.1. 现存的情况1 1.2. 接口返回类型,与返回序列化格式1 1.3. 异常传递 代替返回值模式1 1.4. 通用接口原理1 1.5. A ...

  7. ATITIT.翻译模块的设计与实现 api attilax 总结

    ATITIT.翻译模块的设计与实现 api attilax 总结 1. 翻译原理1 2. TMX格式是国际通用格式(xml)1 2.1. 方法/步骤2 3. TRADOS2 4. ATITIT.翻译软 ...

  8. Atitit.数据库存储引擎的原理与attilax 总结

    Atitit.数据库存储引擎的原理与attilax 总结 1. 存储引擎是什么1 2. 其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储2 3. 表的存储有三个文件:结构+数据+索引2 4 ...

  9. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

随机推荐

  1. POJ2032 Building a Space Station(Kruskal)(并查集)

    Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7469   Accepte ...

  2. [BZOJ 4082] Surveillance

    Link: BZOJ 4082 传送门 Solution: 对于链上这样的问题贪心就好了 如果在一个环上,肯定需要将环转化成链,$O(n)$确定起点才能计算 但枚举每个节点拆环再贪心的复杂度为$O(n ...

  3. []ARC098

    咕咕咕 C:普及组难度的题 D:给定$a_{1\cdots n}$,求有多少$1\leq l\leq r\leq n$满足$x_l+\cdots+x_r=x_l\text^\cdots\text^x_ ...

  4. python3 中 and 和 or 运算规律

    一.包含一个逻辑运算符 首先从基本的概念着手,python中哪些对象会被当成 False 呢?而哪些又是 True 呢? 在Python中,None.任何数值类型中的0.空字符串“”.空元组().空列 ...

  5. Java序列化对象为字符串并将字符串反序列化为对象

    对象的序列化与反序列化其实就是将对象的状态保存下来,一般是保存到文件中,但是其实更常用的是将对象序列化为字符串保存到数据库中,然后在需要读取对象的情况下将字符串反序列化为对象.   可以序列化的类必须 ...

  6. 收藏起来,史上最全的 MySQL 高性能优化实战总结!

    转自:https://mp.weixin.qq.com/s/sRsJzFO9dPtKhovJNWN3Dg 一.前言 MySQL 对于很多 Linux 从业者而言,是一个非常棘手的问题,多数情况都是因为 ...

  7. NSNotificationCenter监听TextField文字变化

    注册 1: NSNotificationCenter.defaultCenter().addObserver(self, selector: "textDidChange", na ...

  8. SQLServer组成:

    SQL Server DB Engine (Relational Engine),SQL语言用于向Engine描述问题. Algebrizer:代数器,检查语法,并将查询转换成内部表达式 Query ...

  9. MathType插入带序号公式的两种方法

    方法一: 由于我之前使用表格15% 70% 15%来布局的,所以最开始相的就是如何录入公示后插入公式序号,如下图所示 先设置序号格式 录好公式后点“Insert Number”就好了,这样的话需要紧挨 ...

  10. Python+C混编

    Python最慢!C最快!Python+C混编?结果可想而知! 樱桃种子 百家号04-1712:11 共享库 使用C语言编译产生共享库,然后python使用ctype库里的cdll来打开共享库. 举例 ...