【Mysql】Mysql表分区类型及示例

前言

查看分区:

SELECT
	PARTITION_NAME,
	PARTITION_METHOD,
	PARTITION_EXPRESSION,
	PARTITION_DESCRIPTION,
	TABLE_ROWS,
	SUBPARTITION_NAME,
	SUBPARTITION_METHOD,
	SUBPARTITION_EXPRESSION
FROM
	information_schema. PARTITIONS
WHERE
	TABLE_SCHEMA = SCHEMA ()
AND TABLE_NAME = 'employees1';
SELECT * from table PARTITION(区名)

一、Range分区

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
);

注意: 

PARTITION p3 VALUES LESS THAN MAXVALUE );

考虑到可能的最大值

二、List分区

MySQL中的List分区与范围分区类似。主要区别在于,在列表分区中,每个分区是根据一组值,这些值是属于table分区列中的列值,而不是在一组连续范围中定义和选择的值。

区域商店ID号码

北3,5,6,9,17                   东1,2,10,11,19,20                     西方4,12,13,14,18                       中央7,8,15,16

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)
);
INSERT INTO employees1 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,100);

插入store_id不属于任何分区的数据,InnoDBMyISAM引擎下,都要报错。

您可以使用IGNORE关键字来忽略这种类型的错误。如果这样做,则不插入包含不匹配的分区列值的行,但是插入任何具有匹配值的行,并且没有报告错误:

三、COLUMNS分区

COLUMNS 分区包括RANGE COLUMNS分区和LIST COLUMNS分区,它们都支持使用非整数列来定义值范围或列表成员

  支持 不支持
整数类型 TINYINT, SMALLINT, MEDIUMINT, INT (INTEGER),和 BIGINT 其他数字数据类型(例如 DECIMAL或 FLOAT)不支持作为分区列
日期类型 DATE和 DATETIME 使用与日期或时间相关的其他数据类型的列不支持作为分区列
字符串类型 CHAR, VARCHAR, BINARY,和 VARBINARY TEXT并且 BLOB不支持列作为分区列


3.1 RANGE COLUMNS分区

 1.RANGE COLUMNS分区与RANGE分区的区别:

1 RANGE COLUMNS 不接受表达式,只接受列的名称。
2 RANGE COLUMNS 接受一列或多列。
3 RANGE COLUMNS分区基于 元组(列值列表)之间的比较,而不是标量值之间的比较。
4 RANGE COLUMNS分区列不限于整数列; 字符串 DATE和 DATETIME列也可以用作分区列。

2.语法

CREATE TABLE table_name
PARTITIONED BY RANGE COLUMNS(column_list) (
    PARTITION partition_name VALUES LESS THAN (value_list)[,
    PARTITION partition_name VALUES LESS THAN (value_list)][,
    ...]
)

3.示例

CREATE TABLE users (
	u_id INT DEFAULT NULL,
	u_name VARCHAR (20) DEFAULT NULL,
	u_age INT DEFAULT NULL,
	u_address VARCHAR (100) DEFAULT NULL,
	u_create_time date DEFAULT NULL
) ENGINE = myisam PARTITION BY RANGE COLUMNS (u_id)(
	PARTITION p0
	VALUES
		less than (10000),
		PARTITION p1
	VALUES
		less than (20000),
		PARTITION p2
	VALUES
		less than (30000),
		PARTITION p3
	VALUES
		less than (40000),
		PARTITION p4
	VALUES
		less than (50000),
		PARTITION p5
	VALUES
		less than (60000),
		PARTITION p6
	VALUES
		less than MAXVALUE
)

3.2 LIST COLUMNS分区

CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
        '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
    PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
        '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
    PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
        '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
    PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
        '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);
CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'Högsby', 'Mönsterås'),
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'Västervik'),
    PARTITION pRegion_3 VALUES IN('Nässjö', 'Eksjö', 'Vetlanda'),
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'Växjo')
);

四、HASH分区

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( YEAR(hired) )
PARTITIONS 4;
CREATE TABLE employees4 (
    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;

 hash函数  分区名n=mod(store_id,4)

INSERT INTO employees4 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,10);
INSERT INTO employees4 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,11);
INSERT INTO employees4 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,8);
INSERT INTO employees4 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,1);
INSERT INTO employees4 VALUES (15, 'dd','dd','1970-01-01','1970-01-01',12,9);

(执行前言中第一个语句) 

 

、Key分区

key分区与hash分区很相似

key分区与hash分区的区别
key分区

1.key分区支持除text和blob以外的所有数据类型

2.不允许用户自定义表达式进行分区

KEY分区使用系统提供的HASH函数进行分区

当表中存在主键或者唯一键时,如果创建key分区时没有指定字段系统默认会首选主键列作为分区字列,

如果不存在主键列会选择非空唯一键列作为分区列,注意唯一列作为分区列唯一列不能为null。

hash分区 1.hash分区只支持数字类型分区
CREATE TABLE tm1 (
    s1 CHAR(32) PRIMARY KEY
)
PARTITION BY KEY(s1)
PARTITIONS 10;

六、子分区

子分区,也称复合分区

CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) )
    SUBPARTITIONS 2 (
        PARTITION p0 VALUES LESS THAN (1990),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE
    );

ts有3个RANGE 分区。这些分区中的每一个p0p1p2进一步分成2子分区。实际上,整个表分为多个 3 * 2 = 6分区。但是,由于该PARTITION BY RANGE子句的作用,其中前两个仅存储purchased列中值小于1990的那些记录。

insert into ts VALUES(12,"1990-12-06");
insert into ts VALUES(1,"1991-12-04");
insert into ts VALUES(17,"1992-01-01");
insert into ts VALUES(14,"2001-09-21");
insert into ts VALUES(16,"2018-10-11");

也可以使用SUBPARTITION子句显式定义子分区, 以指定各个子分区的选项。

-- 创建与ts上一个示例中显示的相同的表的更详细的方式
CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000) (
            SUBPARTITION s2,
            SUBPARTITION s3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s4,
            SUBPARTITION s5
        )
    );

注意:

1.每个分区必须具有相同数量的子分区。

2.如果SUBPARTITION在分区表的任何分区上显式定义任何子分区 ,则必须全部定义它们。

-- 错误示例
CREATE TABLE ts (id INT, purchased DATE)
    PARTITION BY RANGE( YEAR(purchased) )
    SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
        PARTITION p0 VALUES LESS THAN (1990) (
            SUBPARTITION s0,
            SUBPARTITION s1
        ),
        PARTITION p1 VALUES LESS THAN (2000),
        PARTITION p2 VALUES LESS THAN MAXVALUE (
            SUBPARTITION s2,
            SUBPARTITION s3
        )
    );

 即使它包含一个SUBPARTITIONS 2项,该陈述仍然会失败 。

3.每个SUBPARTITION子句必须包含(至少)子分区的名称。否则,您可以为子分区设置任何所需选项,或允许其采用该选项的默认设置。

4.子分区名称在整个表中必须是唯一的。

子分区可以与特别大的MyISAM表一起使用, 以跨多个磁盘分发数据和索引。

你可以选择使用Navicat for MySQL工具进行分区


示例来自于mysql:https://dev.mysql.com/doc/refman/5.7/en/partitioning.html

参考:https://www.cnblogs.com/sandea/p/5723380.html

猜你喜欢

转载自blog.csdn.net/heni6560/article/details/83823238