1. 程式人生 > >【Mysql】Mysql表分割槽型別及示例

【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