mysql 分区 管理

kevin.Zhu 发布于:2013-1-16 13:07 分类:Mysql  有 15 人浏览,获得评论 0 条  

RANGE和LIST分区的管理

假设已经使用下面的CREATE TABLEINSERT语句创建了一个按照RANGE分区的表,并且已经插入了10条记录:

 mysql>CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE) 
  ->PARTITION BY RANGE(YEAR(purchased)) 
  ->( 
  ->PARTITION p0 VALUES LESS THAN (1990), 
  ->PARTITION p1 VALUES LESS THAN (1995), 
  ->PARTITION p2 VALUES LESS THAN (2000), 
  ->PARTITION p3 VALUES LESS THAN (2005) 
  ->); 
 Query OK, 0 rows affected (0.01 sec) 
   
 mysql>INSERT INTO tr VALUES 
  ->(1, 'desk organiser', '2003-10-15'), 
  ->(2, 'CD player', '1993-11-05'), 
  ->(3, 'TV set', '1996-03-10'), 
  ->(4, 'bookcase', '1982-01-10'), 
  ->(5, 'exercise bike', '2004-05-09'), 
  ->(6, 'sofa', '1987-06-05'), 
  ->(7, 'popcorn maker', '2001-11-22'), 
  ->(8, 'aquarium', '1992-08-04'), 
  ->(9, 'study desk', '1984-09-16'), 
  ->(10, 'lava lamp', '1998-12-25'); 
 Query OK, 10 rows affected (0.01 sec) 

可以通过使用下面的命令查看那些记录已经插入到了分区p2中:

 mysql>SELECT * FROM tr 
  ->WHERE purchased BETWEEN '1995-01-01' AND '1999-12-31'; 
 +------+-----------+------------+ 
 | id| name| purchased| 
 +------+-----------+------------+ 
 |3 | TV set| 1996-03-10 | 
 |10 | lava lamp | 1998-12-25 | 
 +------+-----------+------------+ 
 2 rows in set (0.00 sec) 

要删除名字为p2的分区,执行下面的命令:

 mysql>ALTER TABLE tr DROP PARTITION p2; 
 Query OK, 0 rows affected (0.03 sec) 

记住下面一点非常重要:当删除了一个分区,也同时删除了该分区中所有的数据。

如果现在执行一个SHOW CREATE TABLE命令,可以观察到表的分区结构是如何被改变的:

 mysql> SHOW CREATE TABLE tr\G 
 *************************** 1. row *************************** 
  Table: tr 
 Create Table: CREATE TABLE `tr` ( 
  `id` int(11) default NULL, 
  `name` varchar(50) default NULL, 
  `purchased` date default NULL 
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1  
 PARTITION BY RANGE (YEAR(purchased)) ( 
  PARTITION p0 VALUES LESS THAN (1990) ENGINE = MyISAM, 
  PARTITION p1 VALUES LESS THAN (1995) ENGINE = MyISAM, 
  PARTITION p3 VALUES LESS THAN (2005) ENGINE = MyISAM 
 ) 
 1 row in set (0.01 sec) 
 如果插入购买日期列的值在'1995-01-01''2004-12-31'之间(含)的新行到已经修改后的表中时,这些行将被保存在分区p3中。  
 删除LIST分区使用和删除RANGE分区完全相同的“ALTER TABLE ... DROP PARTITION”语法。但是,在对其后使用这个表的影响方面,还是有重大的区别:在这个表中,再也不能插入这么一些行,这些行的列值包含在定义已经删除了的分区的值列表中 
  
 
   
 
 要增加一个新的RANGELIST分区到一个前面已经分区了的表,使用“ALTER TABLE ... ADD PARTITION”语句。对于使用RANGE分区的表,可以用这个语句添加新的区间到已有分区的序列的前面或后面。  
 
 
 ALTER TABLE ADD PARTITION (PARTITION p3 VALUES LESS THAN (2000)); 
 要点:对于通过RANGE分区的表,只可以使用ADD PARTITION添加新的分区到分区列表的高端。设法通过这种方式在现有分区的前面或之间增加一个新的分区,将会导致下面的一个错误: 
 mysql> ALTER TABLE members ADD PARTITION (PARTITION p3 VALUES LESS THAN (1960)); 
 错误1463 (HY000): 对每个分区,VALUES LESS THAN 值必须严格增长
 
 
 LIST分区的表: 
 
 ALTER TABLE tt ADD PARTITION (PARTITION p2 VALUES IN (7, 14, 21)); 
  注意:不能添加这样一个新的LIST分区,该分区包含有已经包含在现有分区值列表中的任意值。如果试图这样做,将会导致错误:  
 mysql> ALTER TABLE tt ADD PARTITION (PARTITION np VALUES IN (4, 8, 12)); 
 错误1465 (HY000): LIST分区中,同一个常数的多次定义
 

HASH和KEY分区的管理

HASHKEY分区的表中删除分区和RANGE或LIST不一样。但,可以使用“ALTER TABLE ... COALESCE PARTITION”命令来合并HASHKEY分区。例如,假定有一个包含顾客信息数据的表,它被分成了12个分区。

 
 
 
 
  要减少分区的数量从126,执行下面的ALTER TABLE命令:  
 mysql> ALTER TABLE clients COALESCE PARTITION 6 
 Query OK, 0 rows affected (0.02 sec) 
   
  COALESCE不能用来增加分区的数量,如果你尝试这么做,结果会出现类似于下面的错误:  
 mysql> ALTER TABLE clients COALESCE PARTITION 18; 
 错误1478 (HY000): 不能移动所有分区,使用DROP TABLE代替
 要增加顾客表的分区数量从1218,使用“ALTER TABLE ... ADD PARTITION”,具体如下: 
 ALTER TABLE clients ADD PARTITION PARTITIONS 18 
 如果想在已经建好的表上进行分区,如果使用alter添加分区的话,mysql会提示错误: ERROR 1505 <HY000> Partition management on a not partitioned table is not possible 正确的方法是新建一个具有分区的表,结构一致,然后用insert into分区表 select * from原始表;