1、为什么要采用分区?

当数据量过大的时候(通常是指百万级或千万级数据的时候),这个时候需要将一张表的数据划分几张表存储。一些查询可以得到极大的优化,这主要是借于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。

2、查看一下mysql是否支持分区

通过以下命令去查看mysql是否支持分区??

show variables like '%partition%';


——如果输出的变量为yes表示mysql是支持分区的。


3、Range分区

CREATE TABLE employees (
  id INT NOT NULL,
  fname VARCHAR(30),
  lname VARCHAR(30),
  hired DATE NOT NULL DEFAULT '1970-01-01',
  separated DATE NOT NULL DEFAULT '9999-12-31',
  job_code INT NOT NULL,
  store_id INT NOT NULL
)

partition BY RANGE (store_id) (
	partition p0 VALUES LESS THAN (6),
	partition p1 VALUES LESS THAN (11),
	partition p2 VALUES LESS THAN (16),
	partition p3 VALUES LESS THAN (21)
);


在这个例子中, 店内工人相关的所有行将保存在分区p0中,办公室和支持人员相关的所有行保存在分区p1中,管理层相关的所有行保存在分区p2中。

查看分区

show create table employees;


4、List分区

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

LIST分区通过使用"PARTITION BY LIST(expr)"来实现,其中"expr"是某列值或一个基于某一个列值、并返回一个整数值的表达式,然后通过"VALUES IN (value_list)"的方式来定义每个分区,其中"value_list"是一个通过逗号分隔的整数列表。

create table category_part( cid int unsigned not null auto_increment,cname varchar(64) not null,parent_id int not null,primary key (cid,parent_id))
partition by list(parent_id)(
partition p1 values in (1,2,3,6,9),
partition p2 values in (4,5,10,22,23),
partition p3 values in (7,8,11,12,13),
partition p4 values in (14,15,16,17,20),
partition p5 values in (18,19,21,24,25)
);


5、HASH分区


hash分区的目的是将数据均匀的分布到预先定义的各个分区中,保证各分区的数据数量大致一致。在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中;而在HASH分区中,MYSQL自动完成这些工作,用户所要做的只是基于将要被散列的列值指定一个列值或者表达式,以及指定呗分区的表将要被分割成的分区数量。

 


要使用HAHS分区来分割一个表,要在CREATE TABLE语句上添加一个PARTITION  BY HASH(expr)子句,其中“expr”是返回一个整数的表达式。expr可以仅仅是字段类型为整型的列名。此外,用户很可能需要在后面再添加一个PARTITITIONS num子句,其中num是非负的整数,它表示将要被分割成分区的数量。如果没有包含一个PARTITIONS子句,分区数量默认为1.

create table t_hash (
a int,
b datetime)
partition by hash (YEAR(b))
partitions 4;


LINEAR HASH分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有大量数据的表。缺点在于,与使用HASH分区得到的数据分布相比,各个分区间数据的分布可能不大均衡。

6、keys分区

create table orders_key
(
id int auto_increment,
customer_surname varchar(30),
store_id int,
alesperson_id int,
order_Date date,
note varcahr(500),
index_idx(id)
) engine=myisam partition by key(order_date) partitions 4;

这个分区类似于hash分区,除了MySQL服务器使用它本身的hash表达式,不像其他类型的分区,不必要求使用一个int或null的表达式。