300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 数据切分——Mysql分区表的管理与维护

数据切分——Mysql分区表的管理与维护

时间:2021-12-06 12:14:34

相关推荐

数据切分——Mysql分区表的管理与维护

关于Mysql分区表的介绍可以参考:

/jhq0113/article/details/44592865

关于Mysql分区表的创建可以参考:

/jhq0113/article/details/44593511

前面已经提过,Mysql支持4种表的分区,即RANGE与LIST、HASH与KEY,其中RANGE和LIST类似,按一种区间进行分区,HASH与KEY类似,是按照某种算法对字段进行分区。

RANGE与LIST分区管理:

案例:有一个聊天记录表,用户几千左右,已经对表按照用户进行一定粒度的水平分割,现仍然有部分表存储的记录比较多,于是按照下列方式有对表进行了分区,分区的好处是,可以动态改变分区,删除分区后,数据也一同被删除,如聊天记录只保存两年,那么你就可以按照时间进行分区,定期删除两年前的分区,动态创建新的的分区就能做到很好的数据维护。

分区表创建的语句如下:

[sql]view plaincopy print? DROPTABLEIFEXISTS`msgss`; CREATETABLE`msgss`( `id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'表主键', `sender`int(10)unsignedNOTNULLCOMMENT'发送者ID', `reciver`int(10)unsignedNOTNULLCOMMENT'接收者ID', `msg_type`tinyint(3)unsignedNOTNULLCOMMENT'消息类型', `msg`varchar(225)NOTNULLCOMMENT'消息内容', `atime`int(10)unsignedNOTNULLCOMMENT'发送时间', `sub_id`tinyint(3)unsignedNOTNULLCOMMENT'部门ID', PRIMARYKEY(`id`,`atime`,`sub_id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8 /*********分区信息**************/ PARTITIONBYRANGE(atime)SUBPARTITIONBYHASH(sub_id) ( PARTITIONt0VALUESLESSTHAN(1451577600) ( SUBPARTITIONs0, SUBPARTITIONs1, SUBPARTITIONs2, SUBPARTITIONs3, SUBPARTITIONs4, SUBPARTITIONs5 ), PARTITIONt1VALUESLESSTHAN(1483200000) ( SUBPARTITIONs6, SUBPARTITIONs7, SUBPARTITIONs8, SUBPARTITIONs9, SUBPARTITIONs10, SUBPARTITIONs11 ), PARTITIONt2VALUESLESSTHANMAXVALUE ( SUBPARTITIONs12, SUBPARTITIONs13, SUBPARTITIONs14, SUBPARTITIONs15, SUBPARTITIONs16, SUBPARTITIONs17 ) );

上述语句创建了三个按照RANGE划分的主分区,每个主分区下面有六个按照HASH划分的子分区。

插入测试数据:

[sql]view plaincopy print? INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH',UNIX_TIMESTAMP(NOW()),1); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH2',UNIX_TIMESTAMP(NOW()),2); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH3',UNIX_TIMESTAMP(NOW()),3); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH10',UNIX_TIMESTAMP(NOW()),10); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH7',UNIX_TIMESTAMP(NOW()),7); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH5',UNIX_TIMESTAMP(NOW()),5); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH',1451577607,1); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH2',1451577609,2); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH3',1451577623,3); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH10',1451577654,10); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH7',1451577687,7); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH5',1451577699,5); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH',1514736056,1); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH2',1514736066,2); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH3',1514736076,3); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH10',1514736086,10); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH7',1514736089,7); INSERTINTO`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)VALUES(1,2,0,'HelloHASH5',1514736098,5);

进行分区分析:

EXPLAIN PARTITIONS SELECT * FROM msgss;

可以检测到分区信息如下:

检测分区数据分布:

[sql]view plaincopy print? EXPLAINPARTITIONSSELECT*FROMmsgssWHERE`atime`<1451577600; EXPLAINPARTITIONSSELECT*FROMmsgssWHERE`atime`>1451577600AND`atime`<1483200000; EXPLAINPARTITIONSSELECT*FROMmsgssWHERE`atime`>1483200000AND`atime`<1514736000; EXPLAINPARTITIONSSELECT*FROMmsgssWHERE`atime`>1514736000;

结果:第一条语句只扫描了t0的所有子分区,第二条语句只扫描了t1的所有子分区,第三四条分别只扫描了t2的所有子分区,证明表的分区和数据分布成功。

需求:目前已经是,需要将所有的聊天记录删除,但是保留的聊天记录,并且的数据也能正常按照分区进行存储。

实现以上需求,需要两步,第一步删除t0分区,第二步按照新规则重建分区。

删除分区语句:

ALTER TABLE `msgss` DROP PARTITION t0;

重建分区语句:

[sql]view plaincopy print? ALTERTABLE`msgss`PARTITIONBYRANGE(atime)SUBPARTITIONBYHASH(sub_id) ( PARTITIONt0VALUESLESSTHAN(1483200000) ( SUBPARTITIONs0, SUBPARTITIONs1, SUBPARTITIONs2, SUBPARTITIONs3, SUBPARTITIONs4, SUBPARTITIONs5 ), PARTITIONt1VALUESLESSTHAN(1514736000) ( SUBPARTITIONs6, SUBPARTITIONs7, SUBPARTITIONs8, SUBPARTITIONs9, SUBPARTITIONs10, SUBPARTITIONs11 ), PARTITIONt2VALUESLESSTHANMAXVALUE ( SUBPARTITIONs12, SUBPARTITIONs13, SUBPARTITIONs14, SUBPARTITIONs15, SUBPARTITIONs16, SUBPARTITIONs17 ) );

查询发现,的数据全部被删除,剩余的数据被重新分区并分布。

未完。。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。