MySQL学习笔记--分区分表

当数据库数据量增大时,为提升性能,可采用分区、分片、分库和分表策略。本文聚焦MySQL的分区和分表。分区是将数据划分为多个区块,可在同一或不同磁盘上,简化查询并提高查询效率。分表则是将大表拆分成多个小表。介绍了FRM、MYD和MYI文件的作用,以及各种分区方式如range、list、hash和子分区。同时探讨了分表的merge存储引擎实现。分区强调突破磁盘读写能力,分表关注并发能力的提升,两者在数据处理逻辑上有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值