逻辑分表
数据表分表设计
根据主键ID作为条件,把数据表分为10个表
partition by key (条件字段id) partitions 10;
条件字段必须是主键或者主键的一部分
create table t_goods(
id int not null auto_increment comment '主键',
name varchar(32) not null comment '名称',
price decimal(10,2) not null default 0 comment '价格',
pubdate date not null comment '出厂时间',
primary key(id,name )
)engine=myisam charset=utf8
partition by key(id) partitions 10;
[root@localhost php41]# pwd
/var/lib/mysql/php41
[root@localhost php41]# ls
db.opt t_goods#P#p1.MYI t_goods#P#p4.MYI t_goods#P#p7.MYI
t_goods.frm t_goods#P#p2.MYD t_goods#P#p5.MYD t_goods#P#p8.MYD
t_goods.par t_goods#P#p2.MYI t_goods#P#p5.MYI t_goods#P#p8.MYI
t_goods#P#p0.MYD t_goods#P#p3.MYD t_goods#P#p6.MYD t_goods#P#p9.MYD
t_goods#P#p0.MYI t_goods#P#p3.MYI t_goods#P#p6.MYI t_goods#P#p9.MYI
t_goods#P#p1.MYD t_goods#P#p4.MYD t_goods#P#p7.MYD
逻辑分表
具体为: key hash ———(求余方式)
range list ———(范围方式)
Hash 分表
create table t_department(
id int not null auto_increment comment '主键',
name varchar(32) not null comment '名称',
price decimal(10,2) not null default 0 comment '价格',
pubdate date not null comment '出厂时间',
primary key(id,name )
)engine=myisam charset=utf8
partition by hash(id) partitions 10;
[root@localhost php41]# ls t_goods_hash*
t_goods_hash.frm t_goods_hash#P#p10.MYI t_goods_hash#P#p2.MYD t_goods_hash#P#p4.MYI t_goods_hash#P#p7.MYD t_goods_hash#P#p9.MYI
t_goods_hash.par t_goods_hash#P#p11.MYD t_goods_hash#P#p2.MYI t_goods_hash#P#p5.MYD t_goods_hash#P#p7.MYI
t_goods_hash#P#p0.MYD t_goods_hash#P#p11.MYI t_goods_hash#P#p3.MYD t_goods_hash#P#p5.MYI t_goods_hash#P#p8.MYD
t_goods_hash#P#p0.MYI t_goods_hash#P#p1.MYD t_goods_hash#P#p3.MYI t_goods_hash#P#p6.MYD t_goods_hash#P#p8.MYI
t_goods_hash#P#p10.MYD t_goods_hash#P#p1.MYI t_goods_hash#P#p4.MYD t_goods_hash#P#p6.MYI t_goods_hash#P#p9.MYD
create table t_goods_hash(
id int not null auto_increment comment ‘主键’,
name varchar(32) not null comment ‘名称’,
price decimal(10,2) not null default 0 comment ‘价格’,
pubdate date not null comment ‘出厂时间’,
primary key(id,pubdate )
)engine=myisam charset=utf8
partition by hash(month(pubdate)) partitions 12;
range 分表
range() 分表
partition by range(month(pubdate))(
partitions 名称 values less than (常量),
partitions 名称 values less than (常量),
partitions 名称 values less than (常量)
)
-- 商品根据 出厂的“年份”进行分表设计
create table t_goods_range(
id int not null auto_increment comment '主键',
name varchar(32) not null comment '名称',
price decimal(10,2) not null default 0 comment '价格',
pubdate date not null comment '出厂时间',
primary key(id,pubdate )
)engine=myisam charset=utf8
partition by range(year(pubdate))(
partition hou70 values less than (1980),
partition hou80 values less than (1990),
partition hou90 values less than (2000),
partition hou00 values less than (2010)
);
[root@localhost php41]# ls t_goods_range*
t_goods_range.frm t_goods_range#P#hou70.MYD t_goods_range#P#hou90.MYD
t_goods_range.par t_goods_range#P#hou70.MYI t_goods_range#P#hou90.MYI
t_goods_range#P#hou00.MYD t_goods_range#P#hou80.MYD
t_goods_range#P#hou00.MYI t_goods_range#P#hou80.MYI
list 分表
根据表达式/字段 的内容是否在某个“列表”中进行分表设计
list() 分表
-- 商品根据出厂的“月份”的季节进行分表设计
partition by range(month(pubdate))(
partitions 名称 values less than (常量),
partitions 名称 values less than (常量),
partitions 名称 values less than (常量)
)
-- 商品根据 出厂的“年份”进行分表设计
create table t_goods_list(
id int not null auto_increment comment '主键',
name varchar(32) not null comment '名称',
price decimal(10,2) not null default 0 comment '价格',
pubdate date not null comment '出厂时间',
primary key(id,pubdate )
)engine=myisam charset=utf8
partition by list(month(pubdate))(
partition spring values in(3,4,5),
partition summer values in(6,7,8),
partition autumn values in(9,10,11),
partition winter values in(12,1,2)
);
[root@localhost php41]# ls t_goods_list*
t_goods_list.frm t_goods_list#P#spring.MYD t_goods_list#P#winter.MYD
t_goods_list.par t_goods_list#P#spring.MYI t_goods_list#P#winter.MYI
t_goods_list#P#autumn.MYD t_goods_list#P#summer.MYD
t_goods_list#P#autumn.MYI t_goods_list#P#summer.MYI
分表管理
具体就是对已经存在的分表进行增加、减少操作。
增加分表 不会引起数据丢失
减少分表 在range/list 领域会造成数据丢失
在key/hash 领域不会造成数据丢失,这两个领域会进行减少分表的同 时,就把全部数据重新整合到存在的表中
key/hash 两种分表与业务逻辑关联不紧密
增加分表
求余方式: Key/hash
alter table 表明 add partitions 数量;
alter table 表名 coalesce partition 12;
范围方式:range/list
alter table 表名 add partition(
partition 名称 values less than (常量)
或
partition 名称 in(n,n,n)
)
减少:
alter table 表名 drop partition 分区名称 ;
删除分区,分区内部数据要丢失
– 增加key 分表
alter table t_goods add partition partitions 3;
[root@localhost php41]# ls t_goods#P#p*
t_goods#P#p0.MYD t_goods#P#p12.MYI t_goods#P#p4.MYD t_goods#P#p7.MYI
t_goods#P#p0.MYI t_goods#P#p1.MYD t_goods#P#p4.MYI t_goods#P#p8.MYD
t_goods#P#p10.MYD t_goods#P#p1.MYI t_goods#P#p5.MYD t_goods#P#p8.MYI
t_goods#P#p10.MYI t_goods#P#p2.MYD t_goods#P#p5.MYI t_goods#P#p9.MYD
t_goods#P#p11.MYD t_goods#P#p2.MYI t_goods#P#p6.MYD t_goods#P#p9.MYI
t_goods#P#p11.MYI t_goods#P#p3.MYD t_goods#P#p6.MYI
t_goods#P#p12.MYD t_goods#P#p3.MYI t_goods#P#p7.MYD
– range 增加分区
alter table t_goods_range
add partition(
partition hou10 values less than(2020)
);
– list 增加分区
alter table t_goods_list add PARTITION (
PARTITION sji values in (13,14,15)
)
s
[root@localhost php41]# ls t_goods_list*
t_goods_list.frm t_goods_list#P#sji.MYD t_goods_list#P#summer.MYD
t_goods_list.par t_goods_list#P#sji.MYI t_goods_list#P#summer.MYI
t_goods_list#P#autumn.MYD t_goods_list#P#spring.MYD t_goods_list#P#winter.MYD
t_goods_list#P#autumn.MYI t_goods_list#P#spring.MYI t_goods_list#P#winter.MYI
删除分表
求余方式(key/hash) :
alter table 表名 coalesce partition 12;
删除分表不会造成数据丢失,每次分表数据都会重新整合到存在的份表中。
范文方式(range/list):
alter table 表名 drop partition 分区名称