mysql数据库分库分表解析

一、什么情况下进行分库分表

数据库分库分表通常是在业务量猛增,单个库或者单个表承受不住发送过来的查询请求,这时候就要考虑分库分表了。

二、分库

首先分库就是将一些表放到不同的数据库上,如果数据库不在一个节点上,这样还有一定防止数据丢失能力,不至于服务器节点崩溃恢复不了的情况下数据丢失的问题,当然这些都是在数据库没有备份的情况下。就比如网购系统分为订单库、商品库等

三、分表

分表一般分为水平分表和垂直分表,水平分表就是对数据进行分表一般都是按照日期进行分表,垂直分表则是将字段进行切割分表,就比如将用户分为基本信息表和详情信息表,这样将字段进行切分。坏处就是会导致后续事务、排序、主键自增功能(这个可以通过UUID实现,也可以通过雪花算法生成分布式ID)或分页的时候单表的一些功能就不能使用了,比如事务就要改为分布式事务,分布式的主要协议是XA协议,XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。

四、分库分表的原因

分库就是数据库节点内存或磁盘等一系列原因导致承载不住数据库的访问、访问速度明显变慢的时候、单个节点的空间不足以承载数据库的数据这些原因因为导致的大部分与硬件有关。

分表一般则是mysql数据库中存储的数据导致存储引擎innodb的B+数的高度超过三层导致的,B+树超过三层就会导致磁盘I/O大量增加导致一个查询拖垮这个数据库

五、B+树层数判断方法

B+树的层数判断方法为:mysql的存储引擎最小存储单元是页,每页的大小是16K,其中B+树的叶子节点负责存放数据,就是数据库中存放的一行一行的数据,如果是索引页就是存放的子节点的最小id(子节点页数据中的最小ID)和对应的子节点的标识或者说页码,如果是叶子节点(数据页)就是存放的id和对应的数据,这样我们就可以算出来B+树的层数了,如果是叶子节点且叶子节点中的每行数据大小为1K,那么每个叶子节点可以存放的数据就是16K/1K=16条数据,那么非叶子节点就是16K/(节点最小id+对应的叶子节点指针大小),最小节点id+对应的叶子节点指针大小=(假设主键ID为bigint类型,长度为8字节(面试官问你int类型,一个int就是32位,4字节),而指针大小在InnoDB源码中设置为6字节,所以就是 8+6=14 字节,16k/14B =16*1024B/14B = 1170),那么索引页就可以存放的叶子节点数据行数为,然后寻找数据的话就通过二分法进行查询,因为每个页数据都是大小16K,所以两层B+树存放的数据是就是1170*16,三层就是1170*1170*16。

文章参考了以下连接

https://blog.csdn.net/qq_45027843/article/details/140589616

分库分表概念以及应用场景-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值