数据库分库分表

Mysql进行分区:将超大的数据集打散成多个数据文件(多个ibd文件),这样进行数据查询的时候就可以缩小磁盘扫描范围

数据库分库分表_第1张图片

 将表划分为多个不重叠的部分,有三种分区方式:

(1)range分区:按照范围进行分区,比如按照时间范围进行分区

下表就是2000年出生的一个区,2001年出生的一个区......

数据库分库分表_第2张图片

 (2)hash分区:将数据均匀的分布到各个分区上,你可以自己指定模数以及余数是几分到哪个分区

数据库分库分表_第3张图片

 (3)list分区:和range分区很像,只不过list分区是不连续的,是枚举类型,比如下面根据班级A,B,C来分区就是list分区

数据库分库分表_第4张图片

 通过分区键,先定位到数据所在的分区,这样就可以避免对大表的全表扫描

分区表的特点就是多张分区表对外暴露是一张表,但是底层数据存储的时候是区分保存的:

比如下面就是按照年份对订单表进行分区:

数据库分库分表_第5张图片

现在想要查询的是2023年的数据库,只需要在1号ibd数据文件中进行查询,0号和2号就不需考虑,

 

分片:将数据库横向扩展到多个物理节点上 shard(碎片),将数据库达成一个一个小块。每个小块就叫分片

只分库不分表

只分表不分库

以及既分库也分表

(1)只分库不分表

当数据库的读,或者写的qps过高,导致数据库的连接不足了,这时候就要考虑做分库了,通过增加数据库的方式,来提供更多的可用数据库连接,从而提升系统的并发度

将一个数据库的数据拆分到多个数据库中

垂直分库:根据业务来分库

数据库分库分表_第6张图片

 水平分库:userId尾号为奇数的放到库1中,尾号为偶数的放到库2中

(2)当你的表单数据非常大的时候,因为并发不高,所以数据库的连接是够的,但是存储和查询的性能遇到了瓶颈,这个时候就要考虑做水平分表了,通过将数据拆分到多张表中来减少单表的数据量,从而提高查询的速度

(3)既分库又分表

当数据库连接不够了,并且单表的数据量也很大,导致查询的速度比较慢的时候,这个时候再考虑既分库又分表

总结:如果是数据库的连接不够了(并发访问量太大了,数据库连接池中的连接都被)

单库来保存数据:这个数据库中包含多张数据表

数据库分库分表_第7张图片

 用户读数据请求和写数据请求都是操作同一个数据库

(1)开始分表,将用户表拆分成用户基本信息表和用户扩展表

用户基本信息表中存的是用户最主要的信息,比如用户名,密码,别名,手机号,邮箱,年龄,性别等核心数据,这些信息查询的频次非常高,用户扩展表中存的是用户的扩展信息,比如所属单位,户口所在地,所在城市等等,非核心数据,这些信息只有在特定的业务场景中才需要查询,绝大数业务场景中是不需要的(另一个分表原则是将调用频次高的放到一张表,调用频次低的放到另一张表中)

分表使得核心数据和非核心数据分开

(2)一个数据库拆分成四个数据库

数据库分库分表_第8张图片

 (3)分库分表

只分库或者只分表是不够的

比如财务报告: 每年是一个单独的库,每个月份是一张表

数据库分库分表_第9张图片

水平拆分和垂直拆分

数据库分库分表_第10张图片

数据库分库分表_第11张图片

userid对2取余,如果是奇数就放到库1(userid再对8取余,余几就放到哪张表里面),如果是偶数就放到库0(userid再对8取余,余几就放到哪张表里面)

你可能感兴趣的:(mysql,mysql)