数据库分区表(数据库分区和分表的区别)
大家好,今天来为大家分享数据库分区表的一些知识点,和数据库分区和分表的区别的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
数据库中表分割和表分区的区别是什么
个人认为理论上使用表分割在性能上应该和建立表分区查不多,但是,表分割对于所有的数据库都适用,而表分区只能用于oracle这样的特定的数据库;表分区属于数据库物理设计,表分割属于逻辑设计。
表分区:
表分区是ORACLE对于非常大的表进行优化的一种有效方法,是非常有效的一种手段,在很多情况下,比你说的表分割更有效,比如,有一个代码表,使用分区表把100万纪录分在10个分区中(ID每从1到10万为一个分区),那样写查询语句的时候,只要给出查询条件中所需要的代码,ORACLE自动会定位到对应的分区进行查询,大大降低的查询时间.而采用表分割,那必须先根据查询的代码指定所要查询的表,才能找到相应的纪录.而且,如果有下面这样的语句,查询的条件是跨分区的:
SELECT* FROM MYTABLE WHERE ID BETWEEN 99000 AND 10111;
在分区表中是非常容易实现的,ORACLE会自动在两个分区中查询;而采用表分割的话是否必须写成两个查询语句在UNION ALL。
事实上,大型的数据库都有对大表的特殊处理方式(类似于分区表),如果太强调可移植性而放弃这些最重要的特性的话,那性能很可能受到很大的影响.
即便是oracle数据库,当数据量很大时,用分表比用表分区要快些,尤其是在表用到group by求和等操作。
我也认为表分区要好一些,也就是一般说来的分区表,对这些表操作起来有很多强大的功能,说他强大主要是体现在对与表中有海量数据的情况之下的,试问大家一个其中有1亿条记录的表你是否会经常的将其移植到其他数据库系统当中去呢?
表分区基于物理存储,还有就是基于分区的索引可以使用,很不错的,当然,这些都是在海量数据情况之下的比较,但是如果真要是数据量不大的情况下比较,我想要比较分区表和表分割就没什么意思了。
表分区的效果对硬件有所依赖,而且效果恐怕不如诸位想象中那么好。我做过一点测试,很失望。
而表分割的效率提升在很多时候(不是所有时候)是很明显的。
当然这都是在巨型表的前提下讨论,缩小表和索引的规模有利于提高效率,这正是分割表的特点。
表分割:
1、水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
水平分割通常在下面的情况下使用:A表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。B表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。C需要把数据存放到多个介质上。
例如法规表law就可以分成两个表active-law和 inactive-law。activea-authors表中的内容是正生效的法规,是经常使用的,而inactive-law表则使已经作废的法规,不常被查询。水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。
2、垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要join操作。
数据库分区和分表的区别
分区、分表、分库的详细理解
一、什么是分区、分表、分库
分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
一旦分表,一个库中的表会越来越多
将整个数据库比作图书馆,一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
二、常用的单机数据库的瓶颈
问题描述
单个表数据量越大,读写锁,插入操作重新建立索引效率越低。
单个库数据量太大(一个数据库数据量到就是极限)
单个数据库服务器压力过大
读写速度遇到瓶颈(并发量几百)
三、分区
什么时候考虑使用分区?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
表中的数据是分段的
对数据的操作往往只涉及一部分数据,而不是所有的数据
分区解决的问题
主要可以提升查询效率
分区的实现方式(简单)
mysql5开始支持分区功能
四、分表
什么时候考虑分表?
一张表的查询速度已经慢到影响使用的时候。
sql经过优化
数据量大
当频繁插入或者联合查询时,速度变慢
分表解决的问题
分表后,单表的并发能力提高了,磁盘I/O性能也提高了,写操作效率提高了
查询一次的时间短了
数据分布在不同的文件,磁盘I/O性能提高
读写锁影响的数据量变小
插入数据库需要重新建立索引的数据减少
分表的实现方式(复杂)
需要业务系统配合迁移升级,工作量较大
分区和分表的区别与联系
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
当访问量大,且表数据比较大时,两种方式可以互相配合使用。
当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略(类似)
Range(范围)
Hash(哈希)
按照时间拆分
Hash之后按照分表个数取模
在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系
逻辑分区的“分区表”在哪里
硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。
一.分区表的位置及识别标志
分区表一般位于硬盘某柱面的0磁头 1扇区.而第1个分区表(也即主分区表)总是位于
(0柱面,1磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来.分区表有64个字节,占据其所在扇区的[441-509]字节.要判定是不是分区表,就看其后紧邻的两个字节(也即[510-511])是不是'55AA',若是,则为分区表.
二.分区表的结构
分区表由4项组成,每项16个字节.共4×16= 64个字节.每项描述一个分区的基本信息.每个字节的含义如下:
分区表项含义字节含义0Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区.1,2,3该分区的起始磁头号,扇区号,柱面号磁头号-- 1字节,扇区号-- 2字节低6位,柱面号-- 2字节高2位+ 3字节4分区文件系统标志:
分区未用: 0x00H.
扩展分区: 0x05H, 0x0FH.
FAT16分区: 0x06H.
FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.
NTFS分区: 0x07H.5,6,7该分区的结束磁头号,扇区号,柱面号,含义同上.8,9,10,11逻辑起始扇区号。表示分区起点之前已用了的扇区数.12,13,14,15该分区所占用的扇区数.
分区表项有几个字节比较重要,下面分别阐述之: 1、(1,2,3)字节磁头号由(1)字节8位表示,其范围为(0-- 28- 1),也即(0磁头-- 254磁头)。扇区号由(2)字节低6位表示,其范围为(0-- 26- 1),由于扇区号从1开始,所以其范围是(1扇区-- 63扇区)。柱面号由(2)字节高2位+(3)字节,共10位表示,其范围为(0--2 10- 1),也即(0柱面-- 1023柱面)。当柱面号超过1023时,这10位依然表示成1023,需要注意。(5,6,7)字节含义同上。 2、(8, 9, 10, 11)字节如果是主分区表,则这4个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面,0磁头,1扇区)之差。如果非主分区表,则这4个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差,要么为63。详细情况在后面有所阐述。注意: 1、扇区上的字节是按左边低位,右边高位的顺序排列的。所以在取值时,需要把字节再反一下,让高位字节在左边,低位字节在右边,这一点在读取逻辑起始扇区号和分区大小时需要注意。举个例子:第一项的逻辑起始扇区为(3F 00 00 00),转换为十进制前要先反一下字节顺序,为(00 00 00 3F)然后在转换为十进制,即63.同理分区大小为(3F 04 7D 00),先反为(00 7D 04 3F)再转换为十进制,即8193087。 2、逻辑扇区号与(柱面,磁头,扇区)的相互转换:令L=逻辑扇区号,C=柱面号,H=磁头号,S=扇区号。每道扇区数= 63每柱面磁头数= 255每柱面扇区数=每道扇区数*每柱面磁头数= 63× 255= 16065柱面号下标从0开始。磁头号[0-- 254],扇区号[1-- 63]。逻辑扇区号下标也从0开始。(柱面,磁头,扇区)转换成逻辑扇区号的公式为: L= C×16065+ H×63+ S- 1;比如(1柱面,1磁头,1扇区),其逻辑扇区号为: L= 1×16065+ 1×63+ 1- 1= 16128逻辑扇区号转换成(柱面,磁头,扇区)公式为: C= L/ 16065 H=(L% 16065)/ 63 S=(L% 16065)% 63+ 1比如逻辑扇区号 16127: C= 16127/ 16065= 1 H=(16127% 16065)/ 63= 0 S=(16127% 16065)% 63+ 1= 63即(1柱面,0磁头,63扇区) 3、分区表上有四项,每一项表示一个分区,所以一个分区表最多只能表示4个分区。主分区表上的4项用来表示主分区和扩展分区的信息。因为扩展分区最多只能有一个,所以硬盘最多可以有四个主分区或者三个主分区,一个扩展分区。余下的分区表是表示逻辑分区的。这里有必要阐述一点:逻辑区都是位于扩展分区里面的,并且逻辑分区的个数没有限制。 4、分区表所在扇区通常在(0磁头,1扇区),而该分区的开始扇区通常位于(1磁头,1扇区),中间隔了63个隐藏扇区。三.分区表链的查找
分区表链实际上相当于一个单向链表结构。第一个分区表,也即主分区表,可以有一项描述扩展分区。而这一项就相当于指针,指向扩展分区。然后我们根据该指针来到扩展分区起始柱面的0头1扇区,找到第二个分区表。对于该分区表,通常情况下:第一项描述了扩展分区中第一个分区的信息,第二项描述下一个分区,而这第二项就相当于指向第二个分区的指针,第三项,第四项一般均为0。我们可以根据该指针来到扩展分区中第二个分区起始柱面的0头1扇区,找到第三个分区表。以此类推,只到最后一个分区表。而最后一个分区表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可以推导找出其后面所有分区表。不过该分区表前面的分区表就不好推导出来了。但令人高兴的是这个链表的头节点,也即主分区表的位置是固定的位于(0柱面, 0磁头, 1扇区)处,我们可以很轻易的找到它,然后把剩下的所有分区表一一找到。
以笔者的硬盘为例:一个主分区(C盘),一个扩展分区.扩展分区中有两个逻辑分区(D盘,E盘)其分区表链示意图如下:
图一分区表链示意图
(一).读取(0柱面,0磁头,1扇区)处C盘的主分区表: [80 01 01 00 0B FE 7F FD 3F 00 00 00 3F 04 7D 00 ] [00 00 41 FE 0F FE FF FF 7E 04 7D 00 1F 2C B4 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]第一项:(80)(01 01 00)(0B)(FE 7F FD)(3F 00 00 00)(3F 04 7D 00)描述的是C盘的情况。 1.(80):表示C盘为活动分区。即系统会从C盘启动。 2.(01 01 00):表示C盘的起始扇区为(0柱面,0磁头,1扇区)。 3.(0B):表示C盘的文件系统为FAT32。 4.(FE 7F FD):(FE) 16=(254) 10(7F) 16=(0111 1111) 2(FD) 16=(1111 1101) 2磁头号:(254) 10;扇区号:(11 1111) 2=(63) 10.柱面号:(01 1111 1101) 2=(509) 10故C盘结束扇区为(509柱面,254磁头,63扇区)。 5.(3F 00 00 00):反向,(00 00 00 3F) 16=(63) 10,为C盘起始逻辑扇区号与逻辑0扇区号之差。表示C盘前面已有63个扇区,这63个扇区为系统隐藏扇区。 6.(3F 04 7D 00):反向,(00 7D 04 3F) 16=(8193087) 10。表明C盘有8193087个扇区。即(0柱面,1磁头,1扇区)至(509柱面,254磁头,63扇区)共有8193087个扇区。第二项:(00)(00 41 FE)(0F)(FE FF FF)(7E 04 7D 00)(1F 2C B4 00)描述的是扩展分区的情况。 1.(00):表示该分区不是活动分区。 2.(00 41 FE):(00) 16=(0) 10(41) 16=(0100 0001) 2(FE) 16=(1111 1110) 2磁头号:(0) 10;扇区号:(00 0001) 2=(1) 10.柱面号:(01 1111 1110) 2=(510) 10所以扩展分区的起始扇区为(510柱面,0磁头,1扇区)。 3.(0F):表示该分区为扩展分区。 4.(FE FF FF):(FE) 16=(254) 10(FF) 16=(1111 1111) 2(FF) 16=(1111 1111) 2;磁头号:(254) 10;扇区号:(11 1111) 2=(63) 10.柱面号:(11 1111 1111) 2=(1023) 10但这是不准确的,因为当柱面号的真实值超过1023时,表示柱面号的10位也依然是1023。 5.(7E 04 7D 00):反向,(00 7D 04 7E) 16=(8193150) 10.表示扩展分区的起始扇区号为8193150,即(510柱面,0磁头,1扇区)。这是真实准确的,我一般都用这一项来定位分区起点。 6.(1F 2C B4 00):反向,(00 B4 2C 1F) 16=(11807775) 10.表示扩展分区共有11807775个扇区。通过上面得到的起点和分区的大小,可以推导出扩展分区的结束位置:8193150+ 11807775= 20000925号扇区,即(1244柱面,254磁头,63扇区)。二.查找D盘分区表根据上面的信息,第二个分区表,也即D盘分区表在(510柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下: [00 01 41 FE 0B FE FF 7B 3F 00 00 00 BF A3 5D 00 ] [00 00 C1 7C 05 FE FF FF FE A3 5D 00 21 88 56 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]第一项:(00)(01 41 FE)(0B)(FE FF 7B)(3F 00 00 00)(BF A3 5D 00)描述的是D盘的情况。 1.(00):表示D盘不是活动分区。 2.(01 41 FE):(01) 16=(1) 10(41) 16=(0100 0001) 2(FE) 16=(1111 1110) 2.磁头号:(1) 10;扇区号:(00 0001) 2=(1) 10.柱面号:(01 1111 1110) 2=(510) 10;故D盘开始扇区为(510柱面,1磁头,1扇区)。 3.(0B):表示D盘的文件系统为FAT32。 4.(FE FF 7B):(FE) 16=(254) 10。(FF) 16=(1111 1111) 2(7B) 16=(0111 1011) 2.磁头号:(254) 10;扇区号:(11 1111) 2=(63) 10.柱面号:(11 0111 1011) 2=(891) 10故D盘结束扇区为(891柱面,254磁头,63扇区)。 5.(3F 00 00 00):反向,(00 00 00 3F)16=(63)10,为D盘起始逻辑扇区号(510柱面,1磁头,1扇区)与扩展分区起始逻辑扇区号(510柱面,0磁头,1扇区)之差。表示D盘前面已有63个扇区,这63个扇区为系统隐藏扇区。 6.(BF A3 5D 00):反向,(00 5D A3 BF) 16=(6136767) 10。表明D盘有6136767个扇区。通过上面得到的起点和分区的大小,可以推导出D盘的结束位置:8193150+ 63+ 6136767= 14329980号扇区。即(891柱面,254磁头,63扇区)。与上面的正好吻合。第二项:(00)(00 C1 7C)(05)(FE FF FF)(FE A3 5D 00)(21 88 56 00)描述的是E盘的情况。 1.(00):表示E盘不是活动分区。 2.(00 C1 7C):(00) 16=(0) 10(C1) 16=(1100 0001) 2(7C) 16=(0111 1100) 2磁头号:(0) 10扇区号:(00 0001) 2=(1) 10柱面号:(11 0111 1100) 2=(892) 10所以E盘的起始扇区为(892柱面,0磁头,1扇区)。 3.(05):表示E盘的在扩展分区里面。 4.(FE FF FF):(FE) 16=(254) 10(FF) 16=(1111 1111) 2(FF) 16=(1111 1111) 2磁头号:(254) 10扇区号:(11 1111) 2=(63) 10柱面号:(11 1111 1111) 2=(1023) 10但这是不准确的,原因同上。 5.(FE A3 5D 00):反向,(00 5D A3 FE) 16=(6136830) 10.这一项非常重要,它定位了E盘分区表所在扇区。其值为E盘分区表所在扇区号与扩展分区起始扇区号之差。所以,E盘分区表所在扇区号为: 8193150+ 6136830= 14329980。即(892柱面,0磁头,1扇区)。 6.(21 88 56 00):反向,(00 56 88 21) 16=(5670945) 10.表示E盘共有11807775个扇区。通过上面得到的起点和分区的大小,可以推导出E盘的结束位置:14329980+ 5670945= 20000925号扇区,即(1244柱面,254磁头,63扇区)。三.查找E盘分区表根据上面的信息,第三个分区表,也即E盘分区表在(892柱面,0磁头,1扇区)处。读取该扇区,得到分区表如下: [00 01 C1 7C 0B FE FF FF 3F 00 00 00 E2 87 56 00] [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ] [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]该分区表第二项全为0,说明没有下一个分区表了。该分区表就是分区表链的最后一个节点。第一项:(00)(01 C1 7C)(0B)(FE FF FF)(3F 00 00 00)(E2 87 56 00)该项与D盘分区表的第二项描述的都是E盘的情况,但它们在某些细节上又有所区别。 1.(00):表示E盘不是活动分区。 2.(01 C1 7C):(01) 16=(1) 10(C1) 16=(1100 0001) 2(7C) 16=(0111 1100) 2.磁头号:(1) 10扇区号:(00 0001) 2=(1) 10柱面号:(11 0111 1100) 2=(892) 10故E盘起始扇区为(892柱面,1磁头,1扇区)。 3.(0B):表示E盘的文件系统为FAT32。 4.(FE FF FF):(FE) 16=(254) 10。(FF) 16=(1111 1111) 2(FF) 16=(1111 1111) 2.磁头号:(254) 10;扇区号:(11 1111) 2=(63) 10.柱面号:(11 1111 1111) 2=(1023) 10但这是不准确的,原因同上。 5.(3F 00 00 00):反向,(00 00 00 3F) 16=(63) 10.这一项与D盘分区表相应项有所不同.为E盘起始逻辑扇区号(892柱面,1磁头,1扇区)与(892柱面,0磁头,1扇区)之差。表示E盘前面已有63个扇区,这63个扇区为系统隐藏扇区。操作系统无法对这些扇区进行读写,所以可以把自己的秘密信息写在这里. 6.(E2 87 56 00):反向,(00 56 87 E2) 16=(5670882) 10。表明E盘有5670882个扇区。而D盘分区表相应项为5670945. 5670945- 5670882= 63.正好等于63个隐藏扇区.这是因为D盘分区表描述的是(892柱面,0磁头,1扇区)到(1244柱面,254磁头,63扇区)之间的扇区数。而E盘分区表描述的是(892柱面, 1磁头,1扇区)到(1244柱面,254磁头,63扇区)之间的扇区数。
关于数据库分区表,数据库分区和分表的区别的介绍到此结束,希望对大家有所帮助。