MySQL学习笔记--分区分表

mysql分区分表

概述
分区
分表

概述
数据库的数据量达到一定程度之后,为避免带来系统性能上得瓶颈。
采用的手段是分区,分片,分库,分表。

分表——把一张表分成多个小表

分区——把一张表的数据分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上

分区
MySQL数据库中的数据是以文件的形势存在磁盘上得,默认放在/mysql/data下面
一张表主要对应着三个文件
frm存放表结构
MYD存放表数据
MYI存表索引

分区的优点
分区可以分在多个磁盘,存储更大一点
根据查找条件,也就是where后面的条件,查找制查找相应的分区不用全部查找了
进行大数据搜索时可以进行并行处理。
跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

分区的方式
横向分区
取出一条数据的时候,这条数据包含了表结构中的所有字段,也就是说横向分区,并没有改变表的结构

纵向分区
在设计用户表的时候,开始的时候没有考虑好,而把个人的所有信息都放到了一张表里面去,这样这个表里就会有比较大的字段,如个人简介,而这些简介,也不会有好多人去看,所以等到有人要看得时候,再去查找,分表的时候,可以把这样的大字段,分开来。

分区实现
1.range

create table info(id int primary key auto_increment,title varchar(32),content text,create_time date
)partition by range(year(create_time))(partition p2019 values less than (2020),partition p2020 values less than (2021),partition p2021 values less than maxvalue);


查看分区

select * from information_schema.PARTITIONS where TABLE_NAME = 'info';insert into info (id,title,content,create_time) VALUES (1,'你有一条信息','xxx','2019-11-25');
insert into info (id,title,content,create_time) VALUES (1,'hello','xxx','2020-11-25');
insert into info (id,title,content,create_time) VALUES (1,'你好','xxx','2021-11-25');
insert into info (id,title,content,create_time) VALUES (1,'再见','xxx','2100-11-25');
#查询
select * from info;#按分区查询
select * from info partition(p2019);
select * from info partition(p2020);
select * from info partition(p2021);select * from info partition(p2110);#报错


list分区
按预定义的值来区分

create table number (num int,name varchar(32)
)partition by list (num)(partition p0 values in (1,3,5,7,9),partition p1 values in (2,4,6,8,0));
#查看分区
select * from information_schema.PARTITIONS where TABLE_NAME = 'number';#插入数据
insert into number (num,name) VALUES (1,'1');
insert into number (num,name) VALUES (2,'2');
insert into number (num,name) VALUES (3,'3');insert into number (num,name) VALUES (10,'10');#查询
select * from number;#按分区查询
select * from number partition(p0);
select * from number partition(p1);
select * from number partition(p2);

hash分区
用类别建立分区

#分类表
create table kind(id int primary key auto_increment,name carchar(32)
);
#商品表
create table goods (id int,name varchar(32)kind int
)partition by hash (kind)
partition 5;#查看分区
select * from information_schema.PATITIONS where TABLE_NAME = 'number';#key 分区
create table key(id int,name varchar(32)
)partition by linear key (id)
partition 3;#查看分区
select * from information_schema.PARTITIONS where TABLE_NAME = 'key_table';

子分区

create table sub_part(id int,content varchar(32),create_time date
)partition by range (year(create_time))
subpartition by hash (to_days(create_time))(partition p0  values less than (2019)(subpartition s0,subpartition s1,subpartition s3),partition p1  values less than (2020)(subpartition s4,subpartition s5,subpartition s6),partition p2  values less than (2021)(subpartition s7,subpartition s8,subpartition s9));

分区管理

#删除
alter table info drop partition p2019#新增
alter table info add partition (partittion p2022 values less then maxvalue);

分表
利用merge存储引擎来实现分表
merge分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。

create table worker1(id int primary key auto_increment,name varchar(32)gender varchar(4)
)engine=MyISAM;create table worker2(id int primary key auto_increment,name varchar(32)gender varchar(4)
)engine=MyISAM;insert into worker1(name,gender) VALUES ('JACK','男');
insert into worker2(name,gender) VALUES ('John','男');create table worker(id int primary key auto_increment,name varchar(32),gender varchar(4)
)engine=merge union = (worker1,worker2) insert_method=last auto_increment=1;insert into worker (name,gender) VALUES ('haha','男');

分区,分表对比——数据处理逻辑
分表
1,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里,
2,分表重点是存去数据时,如何提高Mysql并发能力上
3,用merge来分表,是最简单的一种方式。如果是用其他分表方式就比分区麻烦了


分区
1,不存在分表的概念,分区只不过是把存放数据的文件分成了许多小块,分区后的表,还是一张表。数据处理还是由自己来完成的
2,如何突破磁盘的读写能力,从而达到提高MySQL性能的目的
3,实现是比较简单的,建立分区表,跟建平常的表没什么区别,并且对于代码段来说是透明的。

如何突破磁盘的读写能力,从而达到提高MySQL性能的目的


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部