MySQL优化之表分区

1. 基本概念

基本概念:把一个表,从逻辑上分成多个区域,便于存储数据。

采用分区的前提:数据量非常大。

比如一个用户表,想分成4个区域,如何分呢?

用户的id 1到1000 分到 东区
用户的id 1001到2000 分到 南区
用户的id 2001到3000 分到 西区
用户的id 大于3001的 分到 北区

2. 创建语法

create table user (
    // 创建表的语句
)engine myisam charset utf8
partition by 分区类型 (分区的关键字) (
    // 分区的项
);

3. 分区的类型

(1)list:条件值为一个数据列表。

通过预定义的列表的值来对数据进行分割

例子:假如你创建一个如下的一个表,该表保存有全国20家分公司的职员记录,这20家分公司的编号从1到20。而这20家分公司分布在全国4个区域,如下表所示:

职员表:id name store_id(分公司的id)

北部 1,4,5,6,17,18
南部 2,7,9,10,11,13
东部 3,12,19,20
西部 8,14,15,16

create table p_list( 
    id int, 
    name varchar(32), 
    store_id int 
)partition by list (store_id)( 
    partition p_north values in(1,4,5,6,17,18), 
    partition p_east values in(2,7,9,10,11,13), 
    partition p_south values in(3,12,19,20), 
    partition p_west values in(8,14,15,16) 
);

测试是否用到了分区:

explain partitions select * from p_list where store_id=20\G

注意:在使用分区时,where后面的字段必须是分区字段,才能使用到分区。

(2)Range(范围)

这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区

create table p_range(
    id int,
    name varchar(32),
    birthday date
)partition by range (month(birthday))(
    partition p_1 values less than (3),
    partition p_2 values less than(6),
    partition p_3 values less than(9),
    partition p_4 values less than MAXVALUE
);

less than 小于等于
MAXVALUE 可能的最大值

4. 分区表的限制

只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列,最大分区数目不能超过1024。

如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内。

不支持外键

不支持全文索引(fulltext)

按日期进行分区很非常适合,因为很多日期函数可以用。但是对于字符串来说合适的分区函数不太多。

 

posted @ 2017-04-08 14:49  chenjiacheng  阅读(253)  评论(0编辑  收藏  举报