MySQL分区

来源:互联网 发布:商陆花软件价格 编辑:程序博客网 时间:2024/06/05 09:21

创建分区

1)key:按照某个字段取余

create table partition_1(  id int primary key auto_increment,  title varchar(255) not null default '')engine innodb charset utf8-- key(EXPR)-- EXPR: 某列或者多列的一个列表,哈希函数由 MySQL 提供partition by key(id) partitions 5; --5个分区


2)hash:按照某个(整型)列值或者表达式的值进行取余
create table user_hash(  id int not null auto_increment,  birthday date,  primary key(id,birthday) -- 复合主键, 分区字段必须为主键的一部分)engine innodb charset utf8-- hash (EXPR)-- EXPR: 某个列值或者表达式partition by hash( month(birthday) ) partitions 12;


注意:

 1)  key, hash 都是取余算法,要求分区参数返回的数据必须为整数
 2)  对于所有的分区算法,参与分区的字段需要为主键的一部分
 3)  不推荐使用涉及到多列的哈希表达式


3)list:散列的值

create table user_list(  id int auto_increment,  name varchar(255) default '',  sex tinyint default 0, -- 0 man, 1 woman, 2 other  primary key(id,sex))engine innodb charset utf8-- partition by list(EXPR)-- EXPR: 某列值或者基于某个列值、并返回一个整数值的表达式partition by list(sex)(  -- partition NAME values in(VALUE_LIST)  -- NAME: 分区名  -- VALUE_LIST: 通过逗号分隔的整数列表  partition user_man values in(0),  partition user_woman values in(1),  partition user_other values in(2));


4)range:范围区间

create table user_range(  id int not null auto_increment,  name varchar(255) default '',  birthday date,  primary key(id,birthday))engine innodb charset utf8-- partition by range( EXPR )-- EXPR: 某列值或者基于某个列值、并返回一个整数值的表达式partition by range( year(birthday) )(  -- partition NAME values less than (VALUE)  -- NAME: 分区名  partition user_70 values less than (1980),  partition user_80 values less than (1990),  partition user_90 values less than (2000),  partition user_00 values less than MAXVALUE);


注意:InnoDB 类型的表,需要使用独立表空间,设置参数 

innodb_file_per_table=1



分区管理

1)对于 key,hash 算法

-- 增加alter table TBL_NAME ADD partition partitions 15;-- 15为增加分区后的总分区数量,不是要增加的分区数-- 减少alter table TBL_NAME coalesce partition 7;-- 7为减少分区后的总分区数了,不是要减少的分区数

2)对于 list,range 算法
-- 添加 alter table TBL_NAME ADD partition (   partition PARTITION_NAME values less than (NUM) );-- 删除 alter table TBL_NAME DROP partition PARTITION_NAME; 注意: 删除分区,将同时删除该分区中的所有数据

查看 MySQL 是否支持分区

show variables like '%partition%';


其它分表方式
1. 人为分表
水平分表
  和MySQL分区类似,只是改为人为的控制数据存储在哪张表可以使用MySQL中间件
垂直分表
  将一个表中的常用字段和不常用字段分到两张表中,主表+辅表
  eg:   student_base --常用字段, sutdent_extra --不常用字段
  

2. MySQL的 mrg_myisam 引擎



0 0
原创粉丝点击