明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

詳細(xì)說明mysql重建表分區(qū)并保留數(shù)據(jù)的相關(guān)方法

[摘要]本文介紹mysql重建表分區(qū)并保留數(shù)據(jù)的方法,mysql的表分區(qū)(partition)可以把一個表的記錄分開多個區(qū)去存儲,查詢時(shí)可根據(jù)查詢的條件在對應(yīng)的分區(qū)搜尋,而不需要整表查詢,提高查詢效率。有分...

本文介紹mysql重建表分區(qū)并保留數(shù)據(jù)的方法,mysql的表分區(qū)(partition)可以把一個表的記錄分開多個區(qū)去存儲,查詢時(shí)可根據(jù)查詢的條件在對應(yīng)的分區(qū)搜尋,而不需要整表查詢,提高查詢效率。

有分區(qū)的表與沒有分區(qū)的表使用上沒有太大的區(qū)別,但如果要對表進(jìn)行重新分區(qū),刪除分區(qū)重建會刪除數(shù)據(jù),因此不可直接進(jìn)行操作,需要使用一些特別的處理實(shí)現(xiàn)。

mysql重建表分區(qū)并保留數(shù)據(jù)的方法:

1.創(chuàng)建與原始表一樣結(jié)構(gòu)的新表,新分區(qū)。
2.將原始表中數(shù)據(jù)復(fù)制到新表。
3.刪除原始表。
4.將新表名稱改為原始表名稱。

實(shí)例:

日志表原始結(jié)構(gòu)如下,按id分區(qū)。

CREATE DATABASE `test`;use `test`;CREATE TABLE `log` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '內(nèi)容', `status` tinyint(3) unsigned NOT NULL COMMENT '記錄狀態(tài)', `addtime` int(11) unsigned NOT NULL COMMENT '添加時(shí)間', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改時(shí)間', PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (id)
(PARTITION p10w VALUES LESS THAN (100000) ENGINE = InnoDB,
PARTITION p20w VALUES LESS THAN (200000) ENGINE = InnoDB,
PARTITION p50w VALUES LESS THAN (500000) ENGINE = InnoDB,
PARTITION p100w VALUES LESS THAN (1000000) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;insert into `log`(content,status,addtime,lastmodify) 
values('content1',1, unix_timestamp('2018-01-11 00:00:00'), unix_timestamp('2018-01-11 00:00:00')),
('content2',1, unix_timestamp('2018-02-22 00:00:00'), unix_timestamp('2018-02-22 00:00:00')),
('content3',1, unix_timestamp('2018-03-31 00:00:00'), unix_timestamp('2018-03-31 00:00:00'));

查看數(shù)據(jù)分區(qū)分布

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+  PARTITION_NAME   TABLE_ROWS  
+----------------+------------+  p10w                      3  
  p20w                      0  
  p50w                      0  
  p100w                     0    pmax                      0  
+----------------+------------+


日志數(shù)據(jù)需要按時(shí)間進(jìn)行搜尋,因此需要按日志時(shí)間重建分區(qū)。

1.創(chuàng)建log2,按時(shí)間分區(qū)(每月1個分區(qū))

CREATE TABLE `log2` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '內(nèi)容', `status` tinyint(3) unsigned NOT NULL COMMENT '記錄狀態(tài)', `addtime` int(11) unsigned NOT NULL COMMENT '添加時(shí)間', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改時(shí)間', PRIMARY KEY (`id`,`addtime`), KEY `id`(`id`), KEY `addtime`(`addtime`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (addtime)
(PARTITION p201801 VALUES LESS THAN (unix_timestamp('2018-02-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201802 VALUES LESS THAN (unix_timestamp('2018-03-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201803 VALUES LESS THAN (unix_timestamp('2018-04-01 00:00:00')) ENGINE = InnoDB,
PARTITION p201804 VALUES LESS THAN (unix_timestamp('2018-05-01 00:00:00')) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;


2.將log的數(shù)據(jù)復(fù)制到log2

insert into `log2` select * from `log`;


3.刪除log表

drop table `log`;


4.將log2表改名為log

rename table `log2` to `log`;


執(zhí)行后查看數(shù)據(jù)分區(qū)分布

SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+  PARTITION_NAME   TABLE_ROWS  
+----------------+------------+  p201801                   1  
  p201802                   1  
  p201803                   1  
  p201804                   0    pmax                      0  
+----------------+------------+

可以看到log表的數(shù)據(jù)已經(jīng)按新分區(qū)存儲。

本篇文章講解了mysql重建表分區(qū)并保留數(shù)據(jù)的相關(guān)方法,更多相關(guān)知識請關(guān)注php中文網(wǎng)。

相關(guān)推薦:

關(guān)于php json_encode不支持對象私有屬性的講解

講解PHP生成唯一RequestID類相關(guān)內(nèi)容

MySQL查看數(shù)據(jù)庫表容量大小

以上就是詳解mysql重建表分區(qū)并保留數(shù)據(jù)的相關(guān)方法的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。