1.mysql支持的分区:RANGE/LIST/HASH/KEY RANGE:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。 KEY:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 // range分区:行数据基于属于一个给定连续区间的列值被放入分区,mysql5.5开始支持range columns的分区。 list分区:分区面向的是离散的值,mysql5.5支持list columns。 hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。 key分区:根据MYSQL数据库提供的哈希函数来进行分区。 谨记:无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录; 只有RANGE和LIST支持子分区,但是子分区内只能使用HASH和KEY分区。 2.基本语法 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options] partition_options: PARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) | RANGE{(expr) | COLUMNS(column_list)} | LIST{(expr) | COLUMNS(column_list)} } [PARTITIONS num] [SUBPARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) } [SUBPARTITIONS num] ] [(partition_definition [, partition_definition] ...)] 3.分区限制 (1)创建任何分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。 mysql> create table part1 (col1 int not null, col2 varchar(50) not null, col3 int not null, col4 int not null, unique key(col1,col2)) partition by hash(col3) partitions 4; ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function mysql>create table part1(col1 int not null,col2 varchar(50) not null,col3 int not null,col4 int not null,unique key(col1,col2,col3,col4)) partition by hash(col3) partitions 4; (2)唯一索引可以为空值,并且分区列只要是唯一索引的一个组成部分,不需要整个唯一索引都是分区列。 create table part2 (col1 int not null, col2 varchar(50) not null, col3 int not null, col4 int, unique key(col1,col2,col3,col4)) partition by hash(col3) partitions 5; (3)如果表中没有指定主键,唯一索引,可以指定任何一列为分区列。 create table part3(col1 int not null,col2 varchar(50) not null,col3 int not null,col4 int not null) partition by hash(col3) partitions 5; 4.创建各种分区 1)RANGE分区 CREATE TABLE titles ( emp_no INT NOT NULL, title VARCHAR(50) NOT NULL, from_date DATE NOT NULL, to_date DATE, KEY (emp_no), PRIMARY KEY (emp_no,title, from_date) ) partition by range columns(from_date) (partition p01 values less than ('1985-12-31'), partition p02 values less than ('1986-12-31'), partition p03 values less than ('1987-12-31'), partition p04 values less than ('1988-12-31'), partition p05 values less than ('1989-12-31'), partition p06 values less than ('1990-12-31'), partition p07 values less than ('1991-12-31'), partition p08 values less than ('1992-12-31'), partition p09 values less than ('1993-12-31'), partition p10 values less than ('1994-12-31'), partition p11 values less than ('1995-12-31'), partition p12 values less than ('1996-12-31'), partition p13 values less than ('1997-12-31'), partition p14 values less than ('1998-12-31'), partition p15 values less than ('1999-12-31'), partition p16 values less than ('2000-12-31'), partition p17 values less than ('2001-12-31'), partition p18 values less than ('2002-12-31'), partition p19 values less than ('3000-12-31') ); //查看执行计划 explain partitions select * from titles where from_date < '1985-12-31'; 2)LIST分区 drop table titles; CREATE TABLE titles ( emp_no INT NOT NULL, title VARCHAR(50) NOT NULL, from_date DATE NOT NULL, to_date DATE, KEY (emp_no), PRIMARY KEY (emp_no,title, from_date) ) partition by list columns(title) ( partition p0 values in ('Assistant Engineer'), partition p1 values in ('Engineer'), partition p2 values in ('Manager'), partition p3 values in ('Senior Engineer'), partition p4 values in ('Senior Staff'), partition p5 values in ('Staff'), partition p6 values in ('Technique Leader') ); //查看执行计划 explain partitions select * from titles where title='manger'; 3)HASH分区 CREATE TABLE titles ( emp_no INT NOT NULL, title VARCHAR(50) NOT NULL, from_date DATE NOT NULL, to_date DATE, KEY (emp_no), PRIMARY KEY (emp_no,title, from_date) ) partition by hash(emp_no) partitions 4; //查看执行计划 explain partitions select * from titles where emp_no=499999; 4)KEY分区 CREATE TABLE titles ( emp_no INT NOT NULL, title VARCHAR(50) NOT NULL, from_date DATE NOT NULL, to_date DATE, KEY (emp_no), PRIMARY KEY (emp_no,title, from_date) ) partition by key(emp_no) partitions 4; //查看执行计划 explain partitions select * from titles where emp_no = 499999;