分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。而分区是将数据分段划分在多个位置存放,分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

分区类型主要有range、list、hash、key

以常规hash举例说明分区是如何创建的

常规hash是取模运算

创建一个雇员表,根据id分成4个区,根据取模结果分别分成0,1,2,3四个区

CREATE TABLE `partitions` (
  `id` int(10) NOT NULL,
  `ename` varchar(100) NOT NULL,
  `hired` date NOT NULL DEFAULT '1992-03-03',
  `separated` date NOT NULL DEFAULT '1992-03-03',
  `job` varchar(100) NOT NULL,
  `store_id` int(10) NOT NULL
)
partition by hash (id) partitions 4;

创建成功之后查看数据文件,数据文件和索引文件单独存放

MySQL分区_分区

然后插入数据测试数据是否已经分区存在

MySQL分区_hash_02

按照预定的结果,id为1应该放在分区1,2放在分区2,3放在分区3,4放在分区0

查看分区的分布情况

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='partitions';

MySQL分区_hash_03

可以看到情况如预期一样


hash分区由原来的四个合并成两个,然后查看数据如何存储

ALTER TABLE `partitions` COALESCE PARTITION 2

然后查看分布情况

MySQL分区_mysql_04

发现数据重新取模存储到新的分区