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性能的目的