自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) |