分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,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;
创建成功之后查看数据文件,数据文件和索引文件单独存放
然后插入数据测试数据是否已经分区存在
按照预定的结果,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';
可以看到情况如预期一样
hash分区由原来的四个合并成两个,然后查看数据如何存储
ALTER TABLE `partitions` COALESCE PARTITION 2
然后查看分布情况
发现数据重新取模存储到新的分区