mysql分区介绍以及案例展示

分区类型

RANGE分区(portioning):根据列值所属的范围区间,将元组分配到各个分区。

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:根据用户定义的函数的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。

1.创建分区表

CREATE TABLE part_tab

(c1 int default NULL,c2 varchar(30) default NULL,c3 date default NULL) engine=myisam

PARTITION BY RANGE (year(c3))(

PARTITION p0 VALUES LESS THAN (1995),

PARTITION p1 VALUES LESS THAN (1996) ,

PARTITION p2 VALUES LESS THAN (1997) ,

PARTITION p3 VALUES LESS THAN (1998) ,

PARTITION p4 VALUES LESS THAN (1999),

PARTITION p5 VALUES LESS THAN (2000) ,

PARTITION p6 VALUES LESS THAN (2001) ,

PARTITION p7 VALUES LESS THAN (2002) ,

PARTITION p8 VALUES LESS THAN (2003) ,

PARTITION p9 VALUES LESS THAN (2004) ,

PARTITION p10 VALUES LESS THAN (2010),

PARTITION p11 VALUES LESS THAN MAXVALUE

);

2.创建一个不分区的表

create table no_part_tab(c1 int(11) default NULL,c2 varchar(30) default NULL,c3 date default NULL)engine=myisam;

3.创建一个生成8000000行数据的存储过程

delimiter //

CREATE PROCEDURE load_part_tab()

begin

declare v int default 0;

while v < 8000000

do

insert into part_tab(c1,c2,c3)

values (v,'testing partitions',adddate('1995-01-01',(rand(v)36520) mod 3652));

set v = v + 1;

end while;

end

//

4.调用存储过程,生成数据

delimiter ;

call load_part_tab();

5.把数据同步到no_part_tab表中

insert into no_part_tab select from part_tab;

6.开始测试

explain select count() from no_part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

explain select count() from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';