数据库分区——sharding

分区  主要描述了逻辑水平划分数据的方案。这个方案的特点是将数据分文件或分服务器储存,而不是连续储存

数据的分区是在固定范围内实施的:在传入数据之前,必须提前划分好数据的存储范围,如果一个水平划分的压力超过其所能提供的容量,就需要将数据重分区(reshard)并迁移数据。

重分区并迁移数据是非常消耗资源的操作,等同于数据重做,需要重新划分边界然后横向拆分(split)。大规模的复制操作会消耗大量的 I/O 资源,同时还会临时性的增加存储需求,在对数据重分区的过程中,客户端应用仍然会有更新操作要执行,不过此时的更新操作受重分区的影响会执行的非常慢。

可以采用虚拟分区(virtual shard)的方式减少这种资源消耗,虚拟分区按照关键词定义范围较大的数据分区,每个服务器加载同等数量的数据分区,但是在新增服务器的时候,需要重新加载数据分区到新的服务器上,并且这个过程仍旧需要将数据迁移到新服务器上。

分区是简单的完全脱离用户操作的事后操作,如果没有数据库的支持,可能会对生产系统造成严重破坏。

 


ORACLE 分区

分区表的概念:
  
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表的优点:
1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

分区表的种类:
1.范围分区,一般用于日期化处理,range分区可以很好的管理基于日期来分区的数据
 

create table liusheng (orderid number(10),name varchar2(10),ls_date date);
insert into liusheng values (1,'ls1',to_date('1981-01-02','yyyy-mm-dd'));
insert into liusheng values (1,'ls2',to_date('1998-01-03','yyyy-mm-dd'));
insert into liusheng values (1,'ls3',to_date('1999-01-04','yyyy-mm-dd'));
insert into liusheng values (1,'ls4',to_date('2000-01-05','yyyy-mm-dd'));
insert into liusheng values (1,'ls5',to_date('2000-01-06','yyyy-mm-dd'));
insert into liusheng values (1,'ls6',to_date('2001-01-07','yyyy-mm-dd'));
insert into liusheng values (1,'ls7',to_date('2001-01-08','yyyy-mm-dd'));
insert into liusheng values (1,'ls8',to_date('2002-01-09','yyyy-mm-dd'));
insert into liusheng values (1,'ls9',to_date('2002-01-10','yyyy-mm-dd'));
insert into liusheng values (1,'ls10',to_date('2011-01-11','yyyy-mm-dd'));
创建range分区表
create table liusheng_part
partition by range (ls_date)
(
partition liusheng_part_1999_1 values less than (to_date('1999-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2000_1 values less than (to_date('2000-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2001_1 values less than (to_date('2001-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2002_1 values less than (to_date('2002-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2003_1 values less than (to_date('2003-01-01','yyyy-mm-dd')) ,
partition other values less than (maxvalue)
)
as select * from liusheng;
查看分区
select * from liusheng_part partition (liusheng_part_1999_1);
select * from liusheng_part partition (liusheng_part_2000_1);
select * from liusheng_part partition (liusheng_part_2001_1);
select * from liusheng_part partition (liusheng_part_2002_1);
select * from liusheng_part partition (liusheng_part_2003_1);
select * from liusheng_part partition (other);

2.hash分区,利用hash函数打散某列使数据均匀分布,一般用于均衡I/O,缺点数据不容易管理,哈希分区不能DROP、SPLIT 以及MERGE分区

我们创建了拥有10个分区的哈希分区表“LIUSHENG_HASH”​​​​​​​

create table liusheng_hash partition by hash(object_id) partitions 10 as select * from dba_objects;

hash分区所占用的区个数,看每个分区占用的个数都差不多,说明数据还是比较均匀分布的
缺点:hash列上数值不能有太多的重复值,否则会导致数据分布不均匀

select partition_name,count(*) from user_extents where segment_name='LIUSHENG_HASH' group by partition_name;
PARTITION_NAME                   COUNT(*)
------------------------------ ----------
SYS_P27                                 3
SYS_P26                                 3
SYS_P22                                 2
SYS_P28                                 3
SYS_P29                                 2
SYS_P21                                 2
SYS_P23                                 3
SYS_P25                                 3
SYS_P30                                 2
SYS_P24                                 3
select count(*) from liusheng_hash;

COUNT(*)
----------
      9860


3.创建list分区,一般用于数据可枚举,有限个值,可以考虑列表分区,例如国家名字,按州来分区
创建list分区表,我们按国家来分别存放在不同的州,每个州是一个分区

create table liusheng_list
(city_id NUMBER(5),
city_name VARCHAR2(30),
city_state VARCHAR2(20),
city_amount NUMBER(10)
)
partition by list (city_name)
(
partition  asia VALUES('china','japan'),
partition  europe VALUES ('germany','italy'),
partition  africa VALUES('libya','brazil'),
partition  other  VALUES(DEFAULT)              --默认分区
);
插入数据
insert into liusheng_list values(1,'china','asia',100);
insert into liusheng_list values(2,'germany','europe',101);
insert into liusheng_list values(3,'libya','africa',102);
insert into liusheng_list values(4,'liusheng_city','other',103);
查看数据
LS@LEO> select * from liusheng_list;

   CITY_ID COUNTRY_NAME                   STATE                CITY_AMOUNT
---------- ------------------------------ -------------------- -----------
         1 china                                               asia                         100
         2 germany                                      europe                       101
         3 libya                                                 africa                       102
         4 liusheng_city                                 other                        103

补充:分区之优势
分区技术实质可以把数据分摊到不同的物理位置,增加I/O负载,提高检索效率。
可用性:分区表可以跨越表空间,而普通表则不然,好处就是如果表的一个分区损坏,其他分区不会受到影响我们只需要修复损坏的分区即可

本文参考深度开源网站:https://www.linuxidc.com/Linux/2012-08/67963.htm

发布了33 篇原创文章 · 获赞 3 · 访问量 5877

猜你喜欢

转载自blog.csdn.net/WandaZw/article/details/82348553