数据库分区

2019-11-09  本文已影响0人  粥一样温柔

概念

数据库分区是一种物理数据库的设计技术,它的目的是为了在特定SQL操作中减少数据读写的总量以缩减响应时间。
分表并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘、系统或是不同的服务器存储介质中,以提高数据库检索效率,降低数据库频繁IO压力值,实际上还是一张表。
优点:
1.相较于单个文件系统或是硬盘,分区可以储存更多数据;
2.数据管理比较方便,如:要清理或废弃某年的数据,可以直接删除该日期的分区数据即可;
3.精准定位分区查询数据,不需要权标扫描查询,大大提高数据检索效率;
4.可跨多个分区磁盘查询,提高查询吞吐量;
5.在涉及聚合函数查询时,很容易进行数据合并。

分区类型

RANGE分区: 基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区: 类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区: 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY分区: 类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

RANGE分区:

基于属于一个给定连续区间的列值,把多行分配给分区。
这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
 
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

按照这种分区方案:store_id为1到5工作的雇员相对应的所有行被保存在分区P0中,store_id为6到10的雇员保存在P1中,依次类推。MAXVALUE 表示最大的可能的整数值。

LIST分区:

类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
LIST分区通过使用PARTITION BY LIST(expr)实现,其中expr为某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过VALUES IN (value_list)的方式来定义每个分区,其中value_list是一个通过逗号分隔的整数列表。 注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。

假定有20个音像店,分布在4个有经销权的地区,如下表所示:

地区      商店ID 号
北区      3, 5, 6, 9, 17
东区      1, 2, 10, 11, 19, 20
西区      4, 12, 13, 14, 18
中心区    7, 8, 15, 16

要按照属于同一个地区商店的行保存在同一个分区中的方式来分割表,可以使用下面的“CREATE TABLE”语句:

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
 
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

这使得在表中增加或删除指定地区的雇员记录变得更容易;
如:要删除西区商店的数据时,可以使用:

ALTER TABLE employees DROP PARTITION pWest;

来进行删除。它与具有同样作用的DELETE(删除)

 DELETE FROM employees WHERE store_id IN (4,12,13,14,18);

比起来,要有效得多。

HASH分区:

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个PARTITION BY HASH (expr)子句,其中expr是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你很可能需要在后面再添加一个PARTITIONS num子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量。

    CREATE TABLE employees (
        id INT NOT NULL,
        fname VARCHAR(30),
        lname VARCHAR(30),
        hired DATE NOT NULL DEFAULT '1970-01-01',
        separated DATE NOT NULL DEFAULT '9999-12-31',
        job_code INT,
        store_id INT
    )
    PARTITION BY HASH(store_id)
    PARTITIONS 4;

如果没有包括一个PARTITIONS子句,那么分区的数量将默认为1。

KSY分区:

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

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。

上一篇 下一篇

猜你喜欢

热点阅读