MySQL - 分區

  1. 如果有主鍵,分區鍵必須是主鍵
  2. 查詢分區表統計信息
SELECT PARTITION_NAME,SUBPARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 't_test_p_range_02';

####################
Range分區表

# 創建分區表
create table t_test_p_range_01 (
id int primary key , 
col1 varchar(50), 
col2 varchar(50), 
col3 int not null) 
PARTITION BY RANGE (id) (
partition p1 values less than (10), 
partition p2 values less than (20), 
partition p3 values less than (30),
partition p4 values less than MAXVALUE
);

INSERT INTO t_test_p_range_01 VALUES (1,'a','a','1');
INSERT INTO t_test_p_range_01 VALUES (11,'a','a','1');
INSERT INTO t_test_p_range_01 VALUES (21,'a','a','1');
INSERT INTO t_test_p_range_01 VALUES (31,'a','a','1');


create table t_test_p_range_02 (
id int not null, 
col1 varchar(50), 
col2 varchar(50), 
col3 int not null) 
PARTITION BY RANGE (col3) (
partition p1 values less than (10), 
partition p2 values less than (20), 
partition p3 values less than (30)
);

INSERT INTO t_test_p_range_02 VALUES (1,'a','a','5');
INSERT INTO t_test_p_range_02 VALUES (2,'a','a','15');
INSERT INTO t_test_p_range_02 VALUES (3,'a','a','25');
INSERT INTO t_test_p_range_02 VALUES (4,'a','a','35'); # error


create index on t_test_p_range_02(col3);

alter table t_test_p_range_02 add partition (partition p4 values less than (40));


create table t_test_p_range_03 (
id int, 
col1 varchar(3), 
col2 varchar(50), 
col3 int) 
PARTITION BY RANGE columns (id, col3, col1) (
partition p1 values less than (10,100,'ggg'), 
partition p2 values less than (20,200,'nnn'), 
partition p3 values less than (30,300,'ttt')
);

INSERT INTO t_test_p_range_03(col1,col2,col3) VALUES ('hhh','a','111');
INSERT INTO t_test_p_range_03(id,col1,col2,col3) VALUES (3,'hhh','a','99');
INSERT INTO t_test_p_range_03(id,col1,col2,col3) VALUES (11,'zzz','a','111');
INSERT INTO t_test_p_range_03(id,col1,col2,col3) VALUES (21,'a','a','222'); 

INSERT INTO t_test_p_range_03 VALUES (31,'aa','a','99'); # 

##############################
list:

  1. list是int集合。
  2. 如果是字符類型, 要使用 list columns (col)
create table t_test_p_list_01 (
id int not null, 
col1 varchar(50) not null,
col2 varchar(50),
col3 int not null
)
partition by list (col3)(
partition p1 values in (1,2,3,4,5),
partition p2 values in (11,12,13,14,15),
partition p3 values in (21,22,23,24,25)
);

insert into t_test_p_list_01 values (1,'a','a','1'); 
insert into t_test_p_list_01 values (2,'a','a','11');
insert into t_test_p_list_01 values (3,'a','a','21');
insert into t_test_p_list_01 values (4,'a','a','31');

alter table t_test_p_list_01 add partition (partition p4 values in (31,32,33,34,35));


create table t_test_p_list_02 (
id int not null, 
col1 varchar(50) not null,
col2 varchar(50),
col3 int not null
)
partition by list columns (col1)(
partition p1 values in ('a','b','c','d','e'),
partition p2 values in ('f','g','h','i','j'),
partition p3 values in ('k','l','m','n','o')
);

insert into t_test_p_list_02 values (1,'a','a','1'); 
insert into t_test_p_list_02 values (2,'f','a','11');
insert into t_test_p_list_02 values (3,'k','a','21');
insert into t_test_p_list_02 values (4,'p','a','31');

alter table t_test_p_list_02 add partition (partition p4 values in ('p','q','r','s','t'));

##############################
HASH分區

create table t_test_p_hash_01 (
id int,
col1 varchar(10),
col2 varchar(10),
col3 int
)
PARTITION BY HASH(col3)
PARTITIONS 4;

insert into t_test_p_hash_01 values (1,'a','a','1'); 
insert into t_test_p_hash_01 values (2,'a','a','2'); 
insert into t_test_p_hash_01 values (3,'a','a','3'); 
insert into t_test_p_hash_01 values (4,'a','a','4'); 
insert into t_test_p_hash_01 values (5,'a','a','5'); 
insert into t_test_p_hash_01 values (6,'a','a','6'); 
insert into t_test_p_hash_01 values (5,'a','a','7'); 
insert into t_test_p_hash_01 values (6,'a','a','8'); 


SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 't_test_p_hash_01';



create table t_test_p_hash_02 (
id int,
col1 varchar(10),
col2 varchar(10),
col3 int
)
PARTITION BY LINEAR HASH(col3)
PARTITIONS 4;

insert into t_test_p_hash_02 values (1,'a','a','1'); 
insert into t_test_p_hash_02 values (2,'a','a','2'); 
insert into t_test_p_hash_02 values (3,'a','a','3'); 
insert into t_test_p_hash_02 values (4,'a','a','4'); 
insert into t_test_p_hash_02 values (5,'a','a','5'); 
insert into t_test_p_hash_02 values (6,'a','a','6'); 
insert into t_test_p_hash_02 values (5,'a','a','7'); 
insert into t_test_p_hash_02 values (6,'a','a','8'); 

insert into t_test_p_hash_02 values ( 9,'a','a', '9'); 
insert into t_test_p_hash_02 values (10,'a','a','10'); 

##############################
KEY分區

create table t_test_p_key_01(
id int primary key,
col1 varchar(20),
col2 varchar(20),
col3 int
)
PARTITION BY KEY()
PARTITIONS 3;

insert into t_test_p_key_01 values (1,'a','a','1'); 
insert into t_test_p_key_01 values (2,'a','a','1'); 
insert into t_test_p_key_01 values (3,'a','a','1'); 

insert into t_test_p_key_01 values (4,'a','a','1'); 

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 't_test_p_key_01';

##############################
SUBPARTITION

CREATE TABLE t_test_p_sub_01 (
id INT,
col1 varchar(20),
col2 date,
col3 int
)
    PARTITION BY RANGE( YEAR(col2) )
    SUBPARTITION BY HASH( MONTH(col2) )
    SUBPARTITIONS 4 (
        PARTITION p1 VALUES LESS THAN (1990),
        PARTITION p2 VALUES LESS THAN (2000),
        PARTITION p3 VALUES LESS THAN (2010),
        PARTITION p4 VALUES LESS THAN MAXVALUE
    );

insert into t_test_p_sub_01 values (1, 'a', '1989-01-01',1);
insert into t_test_p_sub_01 values (2, 'a', '1999-02-01',2);
insert into t_test_p_sub_01 values (3, 'a', '2009-03-01',3);
insert into t_test_p_sub_01 values (4, 'a', '2019-04-01',4);

SELECT PARTITION_NAME,SUBPARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 't_test_p_sub_01';


CREATE TABLE t_test_p_sub_02 (
id INT,
col1 DATE,
col2 varchar(10)
)
    PARTITION BY RANGE( YEAR(col1) )
    SUBPARTITION BY HASH( TO_DAYS(col1) ) (
        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
        )
    );

insert into t_test_p_sub_02 values (1,'1989-01-01','a');
insert into t_test_p_sub_02 values (1,'1999-01-01','a');
insert into t_test_p_sub_02 values (1,'2009-01-01','a');

insert into t_test_p_sub_02 values (1,'1989-05-05','a');
insert into t_test_p_sub_02 values (1,'1999-05-15','a');
insert into t_test_p_sub_02 values (1,'2009-05-25','a');

insert into t_test_p_sub_02 values (1,'1989-09-01','a');
insert into t_test_p_sub_02 values (1,'1999-09-11','a');
insert into t_test_p_sub_02 values (1,'2009-09-21','a');
insert into t_test_p_sub_02 values (1,'2001-09-21','a');
insert into t_test_p_sub_02 values (1,'2003-09-21','a');
insert into t_test_p_sub_02 values (1,'2007-09-21','a');

SELECT PARTITION_NAME,SUBPARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 't_test_p_sub_02';

alter table t_test_p_sub_02 add PARTITION 
(PARTITION p2 VALUES LESS THAN (2010) (
            SUBPARTITION s4,
            SUBPARTITION s5)
);

##################################################
分區表管理
alter table tablename +

partition_option:
  | ADD PARTITION (partition_definition) # 增加分區
  | DROP PARTITION partition_names # 刪除分區 (數據一同被刪除)
  | TRUNCATE PARTITION {partition_names | ALL} # 清除分區數據
  | COALESCE PARTITION number # 合併分區(只能應用於hash,key)
  | REORGANIZE PARTITION [partition_names INTO (partition_definitions)] # 移動分區數據,重新組織分區
  | ANALYZE PARTITION {partition_names | ALL} # 分析表分區,收集統計信息
  | CHECK PARTITION {partition_names | ALL} # 與對未分區表使用CHECK TABLE幾乎相同的方式來檢查分區中的錯誤。
  | OPTIMIZE PARTITION {partition_names | ALL} # 優化表分區,回收任何未使用的空間並對分區數據文件進行碎片整理。分析並重建整個表。使用OPTIMIZE PARTITION等效於在該分區上運行CHECK PARTITION,ANALYZE PARTITION和REPAIR PARTITION。
  | REBUILD PARTITION {partition_names | ALL} # 重建分區, 這與刪除存儲在分區中的所有記錄,然後重新插入它們的效果相同。 這對於碎片整理很有用。
  | REPAIR PARTITION {partition_names | ALL} # 修理損壞的分區
  | PARTITION BY partitioning_expression 
  | REMOVE PARTITIONING # 把分區表修改爲不分區
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章