生活随笔
收集整理的這篇文章主要介紹了
数据切分——Mysql分区表的管理与维护
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? ? ? 關(guān)于Mysql分區(qū)表的介紹可以參考:
????????http://blog.csdn.net/jhq0113/article/details/44592865
?????? 關(guān)于Mysql分區(qū)表的創(chuàng)建可以參考:
???????http://blog.csdn.net/jhq0113/article/details/44593511
?????? 前面已經(jīng)提過,Mysql支持4種表的分區(qū),即RANGE與LIST、HASH與KEY,其中RANGE和LIST類似,按一種區(qū)間進(jìn)行分區(qū),HASH與KEY類似,是按照某種算法對(duì)字段進(jìn)行分區(qū)。
?????? RANGE與LIST分區(qū)管理:
?????? 案例:有一個(gè)聊天記錄表,用戶幾千左右,已經(jīng)對(duì)表按照用戶進(jìn)行一定粒度的水平分割,現(xiàn)仍然有部分表存儲(chǔ)的記錄比較多,于是按照下列方式有對(duì)表進(jìn)行了分區(qū),分區(qū)的好處是,可以動(dòng)態(tài)改變分區(qū),刪除分區(qū)后,數(shù)據(jù)也一同被刪除,如聊天記錄只保存兩年,那么你就可以按照時(shí)間進(jìn)行分區(qū),定期刪除兩年前的分區(qū),動(dòng)態(tài)創(chuàng)建新的的分區(qū)就能做到很好的數(shù)據(jù)維護(hù)。
???
?????? 分區(qū)表創(chuàng)建的語句如下:
????????
[sql]?view plain
?copy ?print?
DROP?TABLE?IF?EXISTS?`msgss`;?? CREATE?TABLE?`msgss`?(?? ??`id`?bigint(20)?unsigned?NOT?NULL?AUTO_INCREMENT?COMMENT?'表主鍵',?? ??`sender`?int(10)?unsigned?NOT?NULL?COMMENT?'發(fā)送者ID',?? ??`reciver`?int(10)?unsigned?NOT?NULL?COMMENT?'接收者ID',?? ??`msg_type`?tinyint(3)?unsigned?NOT?NULL?COMMENT?'消息類型',?? ??`msg`?varchar(225)?NOT?NULL?COMMENT?'消息內(nèi)容',?? ??`atime`?int(10)?unsigned?NOT?NULL?COMMENT?'發(fā)送時(shí)間',?? ??`sub_id`?tinyint(3)?unsigned?NOT?NULL?COMMENT?'部門ID',?? ??PRIMARY?KEY?(`id`,`atime`,`sub_id`)?? )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?? /*********分區(qū)信息**************/?? PARTITION?BY?RANGE?(atime)?SUBPARTITION?BY?HASH?(sub_id)??? (?? ????????PARTITION?t0?VALUES?LESS?THAN(1451577600)?? ????????(?? ????????????SUBPARTITION?s0,?? ????????????SUBPARTITION?s1,?? ????????????SUBPARTITION?s2,?? ????????????SUBPARTITION?s3,?? ????????????SUBPARTITION?s4,?? ????????????SUBPARTITION?s5?? ????????),?? ????????PARTITION?t1?VALUES?LESS?THAN(1483200000)?? ????????(?? ????????????SUBPARTITION?s6,?? ????????????SUBPARTITION?s7,?? ????????????SUBPARTITION?s8,?? ????????????SUBPARTITION?s9,?? ????????????SUBPARTITION?s10,?? ????????????SUBPARTITION?s11?? ????????),?? ????????PARTITION?t2?VALUES?LESS?THAN?MAXVALUE?? ????????(?? ????????????SUBPARTITION?s12,?? ????????????SUBPARTITION?s13,?? ????????????SUBPARTITION?s14,?? ????????????SUBPARTITION?s15,?? ????????????SUBPARTITION?s16,?? ????????????SUBPARTITION?s17?? ????????)?? );??
??????? 上述語句創(chuàng)建了三個(gè)按照RANGE劃分的主分區(qū),每個(gè)主分區(qū)下面有六個(gè)按照HASH劃分的子分區(qū)。
??????? 插入測(cè)試數(shù)據(jù):
???????
[sql]?view plain
?copy ?print?
INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH',UNIX_TIMESTAMP(NOW()),1);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?2',UNIX_TIMESTAMP(NOW()),2);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?3',UNIX_TIMESTAMP(NOW()),3);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?10',UNIX_TIMESTAMP(NOW()),10);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?7',UNIX_TIMESTAMP(NOW()),7);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?5',UNIX_TIMESTAMP(NOW()),5);?? ?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH',1451577607,1);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?2',1451577609,2);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?3',1451577623,3);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?10',1451577654,10);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?7',1451577687,7);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?5',1451577699,5);?? ?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH',1514736056,1);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?2',1514736066,2);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?3',1514736076,3);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?10',1514736086,10);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?7',1514736089,7);?? INSERT?INTO?`msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`)?VALUES(1,2,0,'Hello?HASH?5',1514736098,5);?? ?????? ? ? ? ? ???進(jìn)行分區(qū)分析:
??????? EXPLAIN PARTITIONS SELECT * FROM msgss;
??????? 可以檢測(cè)到分區(qū)信息如下:
??????????
???????? 檢測(cè)分區(qū)數(shù)據(jù)分布:
?????????
[sql]?view plain
?copy ?print?
EXPLAIN?PARTITIONS?SELECT?*?FROM?msgss?WHERE?`atime`<1451577600;?? ?? EXPLAIN?PARTITIONS?SELECT?*?FROM?msgss?WHERE?`atime`>1451577600?AND?`atime`<1483200000;?? ?? EXPLAIN?PARTITIONS?SELECT?*?FROM?msgss?WHERE?`atime`>1483200000?AND?`atime`<1514736000;?? ?? EXPLAIN?PARTITIONS?SELECT?*?FROM?msgss?WHERE?`atime`>1514736000;?? ????????????????????結(jié)果:第一條語句只掃描了t0的所有子分區(qū),第二條語句只掃描了t1的所有子分區(qū),第三四條分別只掃描了t2的所有子分區(qū),證明表的分區(qū)和數(shù)據(jù)分布成功。
?????????需求:目前已經(jīng)是2017年,需要將2015年所有的聊天記錄刪除,但是保留2016年的聊天記錄,并且2017年的數(shù)據(jù)也能正常按照分區(qū)進(jìn)行存儲(chǔ)。
??????? 實(shí)現(xiàn)以上需求,需要兩步,第一步刪除t0分區(qū),第二步按照新規(guī)則重建分區(qū)。
??????? 刪除分區(qū)語句:
??????? ALTER TABLE `msgss` DROP PARTITION t0;
??????? 重建分區(qū)語句:
???????
[sql]?view plain
?copy ?print?
ALTER?TABLE?`msgss`?PARTITION?BY?RANGE?(atime)?SUBPARTITION?BY?HASH?(sub_id)??? (?? ????????PARTITION?t0?VALUES?LESS?THAN(1483200000)?? ????????(?? ????????????SUBPARTITION?s0,?? ????????????SUBPARTITION?s1,?? ????????????SUBPARTITION?s2,?? ????????????SUBPARTITION?s3,?? ????????????SUBPARTITION?s4,?? ????????????SUBPARTITION?s5?? ????????),?? ????????PARTITION?t1?VALUES?LESS?THAN(1514736000)?? ????????(?? ????????????SUBPARTITION?s6,?? ????????????SUBPARTITION?s7,?? ????????????SUBPARTITION?s8,?? ????????????SUBPARTITION?s9,?? ????????????SUBPARTITION?s10,?? ????????????SUBPARTITION?s11?? ????????),?? ????????PARTITION?t2?VALUES?LESS?THAN?MAXVALUE?? ????????(?? ????????????SUBPARTITION?s12,?? ????????????SUBPARTITION?s13,?? ????????????SUBPARTITION?s14,?? ????????????SUBPARTITION?s15,?? ????????????SUBPARTITION?s16,?? ????????????SUBPARTITION?s17?? ????????)?? );?? ????????????????????查詢發(fā)現(xiàn),15年的數(shù)據(jù)全部被刪除,剩余的數(shù)據(jù)被重新分區(qū)并分布。
???????? 未完。。。。
轉(zhuǎn)載于:https://www.cnblogs.com/duyinqiang/p/5696360.html
總結(jié)
以上是生活随笔為你收集整理的数据切分——Mysql分区表的管理与维护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。