mysql表分区

首先查看分区表信息


SELECT table_name, partition_name, table_rows FROM information_schema.partitions WHERE table_name=’tablename’

分区的方法:

分区有二个方法: 水平分区、垂直分区

=== 水平分区的几种模式:===
* Range(范围) – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980′s)的数据,90年代(1990′s)的数据以及任何在2000年(包括2000年)后的数据。

* Hash(哈希) – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如DBA可以建立一个对表主键进行分区的表。

* Key(键值) – 上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

* List(预定义列表) – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA建立了一个横跨三个分区的表,分别根据2004年2005年和2006年值所对应的数据。

* Composite(复合模式) – 很神秘吧,哈哈,其实是以上模式的组合使用而已,就不解释了。举例:在初始化已经进行了Range范围分区的表上,我们可以对其中一个分区再进行hash哈希分区。

= 垂直分区(按列分)=
一个包含了大text和BLOB列的表,这些text和BLOB列又不经常被访问,这时候就要把这些不经常使用的text和BLOB了划分到另一个分区,在保证它们数据相关性的同时还能提高访问速度。

rege分区例子

CREATE TABLE `xxxxxxxx` (     
`crttm` int(11) NOT NULL,     
`srvid` int(11) NOT NULL,     
`evtid` int(11) NOT NULL,     
`aid` int(11) NOT NULL,     
`rid` int(11) NOT NULL,     
`itmid` int(11) NOT NULL,     
`itmnum` int(11) NOT NULL,     
`gdtype` int(11) NOT NULL,     
`gdnum` int(11) NOT NULL,     
`islmt` int(11) NOT NULL,  
KEY `crttm` (`crttm`),  
  KEY `itemid` (`itmid`),  
  KEY `srvid` (`srvid`),  
  KEY `gdtype` (`gdtype`)  
) ENGINE=myisam DEFAULT CHARSET=utf8  
PARTITION BY RANGE (crttm)   
(  
PARTITION p201303 VALUES LESS THAN (unix_timestamp('2013-04-01')),  
PARTITION p201304 VALUES LESS THAN (unix_timestamp('2013-05-01')),  
PARTITION p201305 VALUES LESS THAN (unix_timestamp('2013-06-01')),  
PARTITION p201306 VALUES LESS THAN (unix_timestamp('2013-07-01')),  
PARTITION p201307 VALUES LESS THAN (unix_timestamp('2013-08-01')),  
PARTITION p201308 VALUES LESS THAN (unix_timestamp('2013-09-01')),  
PARTITION p201309 VALUES LESS THAN (unix_timestamp('2013-10-01')),  
PARTITION p201310 VALUES LESS THAN (unix_timestamp('2013-11-01')),  
PARTITION p201311 VALUES LESS THAN (unix_timestamp('2013-12-01')),  
PARTITION p201312 VALUES LESS THAN (unix_timestamp('2014-01-01')),  
PARTITION p201401 VALUES LESS THAN (unix_timestamp('2014-02-01'))  
);  

1. primary key和unique key必须包含在分区key的一部分,否则在创建primary key和unique index时会报”ERROR 1503 (HY000)“

 2. 范围分区添加分区只能在最大值后面追加分区
3. 所有分区的engine必须一样
4. 范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp())

 

添加新的分区:

alter table xxxxxxx add partition (partition p0 values less than(1991));  //只能添加大于分区键的分区  

删除分区:

alter table xxxxxxx drop partition p0; //可以删除任意分区  

删除分区数据:

alter table xxxxxx  truncate partition p1,p2;  
alter table xxxxxx  truncate partition all;  
或  
delete from xxxxxx where separated < '2006-01-01' or (separated >= '2006-01-01' and separated<'2011-01-01'); 

 

posted @ 2018-10-12 16:25  做个读书人  阅读(225)  评论(0编辑  收藏  举报