分区是MySQL5.1版本时添加了对分区的支持。分区的过程是将一个表或者索引分解为多个更小,更可管理的部分,每个分区都是独立的对象,可以独立处理,也可以作为一个更大的对象的一部分进行处理。
MySQL数据库支持的分区类型为水平分区,并不支持垂直分区。此外MySQL数据库的分区是局部分区索引,一个分区中既存放了数据有存放了索引。而全局 分区是指数据存放在各个分区中,而索引存放在一个对象中。目前MySQL数据库还不支持全局分区。MySQL5.6 ,让分区交换成了现实。只需要通过ALTER TABLE ...EXCHANGE PARTITION语句即可,也就是说,可以在短暂的时间内将某一个分区内的数据移到其他表中。
实验一:交换主分区
备注:matchedVideo中分区viacom有2410806行记录,如果要将这部分数据备份出来,MySQL 5.1需要新建临时表,然后把这部分数据导出去;
1>备份某一分区数据
mysql> insert into matchedVideo4 select * from matchedVideo where company_id = 14;
Query OK, 2410806 rows affected (12 min 28.41 sec)
Records: 2410806 Duplicates: 0 Warnings: 0
2>删除某一个分区数据(分区保留)
mysql> delete from matchedVideo4 where company_id = 14;
Query OK, 2410806 rows affected (8 min 47.76 sec)
然而MySQL5.6在性能上有了很大的改进,大大的缩短了时间。
mysql> create table matchedVideo2 like matchedVideo;
Query OK, 0 rows affected (1 min 13.84 sec)
mysql> ALTER TABLE matchedVideo2 REMOVE PARTITIONING;
Query OK, 0 rows affected (16.88 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE matchedVideo EXCHANGE PARTITION Viacom WITH TABLE matchedVideo2;
Query OK, 0 rows affected (0.67 sec)
mysql> select count(*) from matchedVideo2;
+----------+
| count(*) |
+----------+
| 2410806 |
+----------+
1 row in set (4.24 sec)
交换分区应遵循以下原则:
1>被交换的表为没有分区,但是有相同结构的表
2>未分区表中的记录必须要在另一表的分区或子分区范围内
mysql> ALTER TABLE matchedVideo EXCHANGE PARTITION Viacom WITH TABLE matchedVideo2;
Query OK, 0 rows affected (0.58 sec)
mysql> update matchedVideo2 set company_id = 10 where id = 75537347;
Query OK, 1 row affected (0