当前位置: > 数据库 > MySQL >

mysql partition 功能

时间:2015-01-11 01:13来源:linux.it.net.cn 作者:IT

自mysql 5.1.3起开始支持分区功能。mysql表中存储的记录和表对应的索引信息,最后都是以文件的方式存储在计算机的硬盘上的,有了分区功能,就可以按照一定的分区规则把这些记录分布到不同的数据文件上,目前分区规则有四种,分别是RANGE、LIST、HASH和KEY,另外通过DATA DIRECTORY和INDEX DIRECTORY选项可以把不同的分区数据文件分散到不同的磁盘上,从而进步一提高系统的IO吞吐量。因此按照业务逻辑设计好了分区,可以大大提高查询效率,而且删除数据可能也会很容易。但是分区也有一些限制:1、主键或者唯一索引必须包含分区字段;2、只能通过int类型的字段或者返回int类型的表达式来分区;3、单表最多只能有1024个分区。

默认mysql是开启了分区功能的,可以通过下述查询查看结果:

show variables like '%partition%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   |
+-------------------+-------+

//YES 表示开启

下面也range规则为例介绍一下分区常用的命令。

1、创建分区。可以在创建表的同时创建,也可以在表创建后追加分区。

drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1;

alter table `netingcn_com` partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);
或
drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1 
 partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);

可以explain命令查看分区是否创建成功
explain partitions select * from netingcn_com where day = 20130412;
+----+-------------+--------------+------------+-------+
| id | select_type | table        | partitions | type  |
+----+-------------+--------------+------------+-------+
|  1 | SIMPLE      | netingcn_com | p_2013     | index |
+----+-------------+--------------+------------+-------+

2、增加或删除分区。注意:删除分区的同时,该分区的所有数据也会别删除。

增加分区
alter table netingcn_com add partition (
  partition p_2014 values less than (20150000)
);

删除分区
alter table netingcn_com drop partition p_2012;

3、重新分区。注意:hash和key分区规则不能用REORGANIZE来重新分区

alter table netingcn_com reorganize partition p_2013,p_2014 into (partition p_2014 values less than (20150000));

更多关于mysql 分区功能可以参考:http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容