MySQL - 分区表

317 阅读3分钟

注意

1):写入数据至分区表时,如果关键字段在操作时未给定存储分区则会报错
        [1526,  'Table has no partition for value 400']
(2):要么分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,否则会报错 
        [A PRIMARY KEY must include all columns in the table's partitioning function]
        [A UNIQUE INDEX must include all columns in the table's partitioning function]
(3):删除分区的命令谨慎使用,因为分区一旦被删除数据也没了

实操命令

(1):创建分区表语句

CREATE TABLE `[表名]` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `region_test` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY [分区类型 |RANGE|LIST|HASH|KEY|] (`region_test`)
(PARTITION [区块名称] VALUES LESS THAN (50) ENGINE = InnoDB,
 PARTITION [区块名称] VALUES LESS THAN (100) ENGINE = InnoDB,
 PARTITION [区块名称] VALUES LESS THAN (150) ENGINE = InnoDB,
 PARTITION [区块名称] VALUES LESS THAN (200) ENGINE = InnoDB,
 PARTITION [区块名称] VALUES LESS THAN (250) ENGINE = InnoDB) */

(2):删除数据表分区块

mysql> ALTER TABLE [数据表名] DROP PARTITION [区块名称];

(3):查询区块占用

SELECT PARTITION_NAME,TABLE_ROWS,DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = [数据表名];
# PARTITION_NAME [区块名称]
# TABLE_ROWS [区块数据数量]
# DATA_LENGTH [数据长度]

(4):新增数据区块

ALTER TABLE [数据表名] PARTITION BY RANGE(id) (
	PARTITION	[区块名称] VALUES LESS THAN (250)  ENGINE = InnoDB,
	PARTITION	[区块名称] VALUES LESS THAN (300) ENGINE = InnoDB,
	PARTITION	[区块名称] VALUES LESS THAN (400) ENGINE = InnoDB
);

分区类型说明

(1):RANGE

    基于属于一个给定连续区间的列值,把多行分配给分区。一般会使用时间的字段来作为分区的列,记录每天的数据。

(2):LIST

    list分区和range分区类似,区别在于list是离散型数值的集合,range是连续的区间值的集合。建议list分区列是非null列,否则插入null值如果枚举列表里面不存在null值会插入失败。其他分区对于null值,range分区会将其作为最小分区值存储,放在第一个分区里面,而HASH\KEY分为会将其转换成0存储,list分区因为只支持整形,非整形字段需要通过函数转换成整形才能插入。   

(3):HASH

    基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

(4):KEY

1):KEY分区允许多列,而HASH分区只允许一列。
(2):如果在有主键或者唯一键的情况下,key中分区列可不指定,默认为主键或者唯一键,如果没有,则必须显性指定列。
(3):KEY分区对象必须为列,而不能是基于列的表达式。
(4):KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。