我在M2公司做架构之数据分区

本文主要内容:

  • 1.什么是数据分区?
  • 2.为什么要数据分区?
  • 3.数据分区有哪些类型?
  • 4.以MySQL为例,分区表的优缺点有哪些?

一、什么是数据分区?

分区是将表和索引分成较小的部分,甚至将其细分为较小的部分。可以将它想象成在一个大仓库(一张大桌子)中存放着数百万本不同主题和年份(例如2000–2019年)的不同杂志。分区意味着您将把它们组织在那个大仓库内的不同房间中。它们仍然属于一个仓库,但是现在您根据数据库分区策略在逻辑级别上对它们进行分组。

二、为什么要数据分区?

它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

三、数据分区有哪些类型?

  • 1.范围分区;
  • 2.哈希分区;
  • 3.列表分区。

1.范围分区

概念:按照数据表中某个值的范围进行分区,根据值的范围,决定将该数据存储在哪个分区中

使用场景:通过绑定自定义的列进行分区,其中最突出的就是根据时间分区,例如 : 客户下单时间,可以分月,季度,半年的形式来缩减数据的量以免在数据库查询时进行全表扫描。

创建分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table orders
(
order_no NUMBER(5),
person VARCHAR2(30),
year_month NUMBER(6)
)
//year_month
PARTITION BY RANGE (year_month)

(
// 分区的区域 p1,p2,..pn
PARTITION P1 values less than (4) tablespace data0,
PARTITION P2 values less than (8) tablespace data1,
......
PARTITION Pn values less than (99) tablespace datan
);

2.列表分区

概念:当数据为一系列离散的数值时,可以进行列表分区。列表分区的分区键由一个单独的列组成,进行操作时,可以直接通过所要操作的数据去查询相应 的分区。

列表分区的优缺点归纳:

  • (1)优点:列表分区最大的优势是可以通过分区来很方便的查找相应的数据,但是列表分区有很大的局限性,这种分区技术要求数据的重复率比较高。
  • (2)缺点:分区与记录值是无关 的,实施难度和可维护性都比较差,而且他的数据分区可能不均匀,这时需要用到哈希分区来存储数据了。

使用场景:
取一些数据库中列的值经常性重复的,例如:财经新闻的地域标签,每个新闻都有标签,根据用户的喜爱或者经常点击的新闻在数据库中添加新闻标签,等下次展示新闻时根据新闻标签去搜索新闻。

创建分区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table news
(
news_no NUMBER(5),
person VARCHAR2(30),
year_month NUMBER(6)
)
//通过person这一列进行分区
PARTITION BY LIST (person)

(
//分区p1的值是abc
PARTITION P1 values ('abc'),
//分区p2的值是def,adf
PARTITION P2 values ('def','adf'),
.......
PARTITION Pn values ('wfs')
);

3.哈希分区

概念:所谓哈希分区,首先将分区编号,之后通过哈希函数来指定分区存储数据。哈希分区一般追求的是数据在分区上均匀分布的特性。在哈希分区中,用户不必考虑自己指定一个列值或列值集合应该存在哪个分区上,数据库自动完成相应的工作。用户只需要确定哈希分区产生的分区数量,以及确定哈希分区的哈希函数进行哈希分区的操作。

使用场景:将股票的代码等唯一性比较强的列设置为分区条件。

哈希分区的特点归纳:

  • (1)基于分区字段的哈希值,自动将记录插入到指定分区中;
  • (2)分区数一般是2的幂;
  • (3)易于实施;
  • (4)总体性能是最佳的;
  • (5)更适于静态数据;
  • (6)适于数据的均匀存储;
  • (7)数据管理能力比较弱;
  • (8)对数据值无法控制。

创建分区:

1
2
3
4
5
6
7
create table stocks
(
stocks_no NUMBER(6),
person VARCHAR2(30),
year_month NUMBER(6)
)
PARTITION BY hash(stocks_no) partitions 4 as select * from dba_objects;

4.三种分区的比较

  • (1)范围分区:主要特点是能根据数据的范围将不同范围的数据存储在不同的分区里。范围分区的特点决定了 它可能是在存储一些数据时必须选择的存储方式。若是按照时间范围来存储数据,范围分区是唯一合适的存储方式。
  • (2)哈希分区:主要特点是能将数据比较均匀的分配到各个分区中,保证各个分区能比较均衡的被利用。当数据重复率高时,哈希分区将大量的数据存储在同一个分区中,这样会导致分区存储的数据不均匀,也会影响到后面数据的操作。哈希分区更适合于存储数据重复率比较低的数据。
  • (3)列表分区:主要特点是按照字段的值来对数据进行分区。列表分区对数据的字段值进行划分,不同的字段值存储在不同的分区上。它适合于存储一些重复率比较高的数据。

四、以MySQL为例,分区表的优缺点有哪些?

1.优点

在MySQL Server层分区表为一个表,而在MySQL存储引擎层分区表是多个表,因此有如下特点:

  • (1)分区表对业务透明,只需要维护一个表的数据结构。
  • (2)DML操作加锁仅影响操作的分区,不会影响未访问分区。
  • (3)通过分区交换快速将数据换入和换出分区表。
  • (4)通过TRUNCATE操作快速清理特定分区数据。
  • (5)通过强制分区仅访问特定分区数据,减少操作影响。
  • (6)通过大数据量分区能有效降低索引层数,提高查询性能。

2.缺点

由于分区表在MySQL Server层为一个表,因此:

  • (1)DDL操作需要锁定所有分区,导致所有分区上操作都被阻塞。
  • (2)当表数据量较小时,分区表和非分区表性能相近,分区表效果有限。
  • (3)当表数据量较大时,对分区表进行DDL或其他运维操作难度大风险高。
  • (4)分区表使用较少,存在未知风险多,BUG多BUG多BUG多,MySQL社区版本免费,横向扩展成本低,分库分表实现简单且中间件完善。- - (5)当单台服务器性能无法满足时,对分区表进行分拆的成本较高,而分库分表能很容易实现横向分拆。
  • (6)当分区表操作不当导致访问所有分区时,会导致严重的性能问题,而分库分表操作不当仅影响访问的表。
  • (7)使用分库分表可以有效运维降低运维操作影响,对1亿数据量表做DDL操作需要谨慎评估,而对10万数据量表做DDL操作可以默认其很快完成。
  • (8)使用分库分表可以有效减小宕机或其他故障影响,将数据分库分表到10套群集上,一套群集发生故障仅影响业务的一成。
文章目录
  1. 一、什么是数据分区?
  2. 二、为什么要数据分区?
  3. 三、数据分区有哪些类型?
    1. 1.范围分区
    2. 2.列表分区
    3. 3.哈希分区
    4. 4.三种分区的比较
  4. 四、以MySQL为例,分区表的优缺点有哪些?
    1. 1.优点
    2. 2.缺点