MySQL 分表

逻辑分表

数据表分表设计
根据主键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 分区名称

猜你喜欢

转载自blog.csdn.net/u013043762/article/details/80241425