[点晴永久免费OA]我们为什么要分库分表?
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
前言
1. 什么是分库分表分库:就是一个数据库分成多个数据库,部署到不同机器。 分表:就是一个数据库表分成多个表。 2. 为什么需要分库分表2.1 为什么需要分库呢?如果业务量剧增,数据库可能会出现性能瓶颈,这时候我们就需要考虑拆分数据库。从这几方面来看:
业务量剧增,MySQL单机磁盘容量会撑爆,拆成多个数据库,磁盘使用率大大降低。
我们知道数据库连接是有限的。在高并发的场景下,大量请求访问数据库,MySQL单机是扛不住的!当前非常火的微服务架构出现,就是为了应对高并发。它把订单、用户、商品等不同模块,拆分成多个应用,并且把单个数据库也拆分成多个不同功能模块的数据库(订单库、用户库、商品库),以分担读写压力。 2.2 为什么需要分表?数据量太大的话,SQL的查询就会变慢。如果一个查询SQL没命中索引,千百万数据量级别的表可能会拖垮整个数据库。 即使SQL命中了索引,如果表的数据量超过一千万的话,查询也是会明显变慢的。这是因为索引一般是B+树结构,数据千万级别的话,B+树的高度会增高,查询就变慢啦。 小伙伴们是否还记得,MySQL的B+树的高度怎么计算的呢? 顺便复习一下吧 InnoDB存储引擎最小储存单元是页,一页大小就是16k。B+树叶子存的是数据,内部节点存的是键值+指针。索引组织表通过非叶子节点的二分查找法以及指针确定数据在哪个页中,进而再去数据页中找到需要的数据,B+树结构图如下: 假设B+树的高度为2的话,即有一个根结点和若干个叶子结点。这棵B+树的存放总记录数为=根结点指针数*单个叶子节点记录行数。
因此,一棵高度为2的B+树,能存放 因此单表数据量太大,SQL查询会变慢,所以就需要考虑分表啦。 3. 如何分库分表3.1 垂直拆分3.1.1 垂直分库在业务发展初期,业务功能模块比较少,为了快速上线和迭代,往往采用单个数据库来保存数据。数据库架构如下: 但是随着业务蒸蒸日上,系统功能逐渐完善。这时候,可以按照系统中的不同业务进行拆分,比如拆分成用户库、订单库、积分库、商品库,把它们部署在不同的数据库服务器,这就是垂直分库。 垂直分库,将原来一个单数据库的压力分担到不同的数据库,可以很好应对高并发场景。数据库垂直拆分后的架构如下: 3.1.2 垂直分表如果一个单表包含了几十列甚至上百列,管理起来很混乱,每次都 比如一张用户表,它包含 3.2 水平拆分3.2.1 水平分库水平分库是指,将表的数据量切分到不同的数据库服务器上,每个服务器具有相同的库和表,只是表中的数据集合不一样。它可以有效的缓解单机单库的性能瓶颈和压力。 用户库的水平拆分架构如下: 3.2.2 水平分表如果一个表的数据量太大,可以按照某种规则(如 一张订单表,按 3.3. 水平分库分表策略分库分表策略一般有几种,使用与不同的场景:
3.3.1 range范围range,即范围策略划分表。比如我们可以将表的主键,按照从 当然,有时候我们也可以按时间范围来划分,如不同年月的订单放到不同的表,它也是一种range的划分策略。 这种方案的优点:
缺点:
3.3.2 hash取模hash取模策略:指定的路由key(一般是user_id、订单id作为key)对分表总数进行取模,把数据分散到各个表中。 比如原始订单表信息,我们把它分成4张分表:
这种方案的优点:
缺点:
3.3.3 range+hash取模混合既然range存在热点数据问题,hash取模扩容迁移数据比较困难,我们可以综合两种方案一起嘛,取之之长,弃之之短。 比较简单的做法就是,在拆分库的时候,我们可以先用range范围方案,比如订单id在0~4000万的区间,划分为订单库1;id在4000万~8000万的数据,划分到订单库2,将来要扩容时,id在8000万~1.2亿的数据,划分到订单库3。然后订单库内,再用hash取模的策略,把不同订单划分到不同的表。 4. 什么时候才考虑分库分表呢?4.1 什么时候分表?如果你的系统处于快速发展时期,如果每天的订单流水都新增几十万,并且,订单表的查询效率明变慢时,就需要规划分库分表了。一般B+树索引高度是2~3层最佳,如果数据量千万级别,可能高度就变4层了,数据量就会明显变慢了。不过业界流传,一般500万数据就要考虑分表了。 4.2 什么时候分库业务发展很快,还是多个服务共享一个单体数据库,数据库成为了性能瓶颈,就需要考虑分库了。比如订单、用户等,都可以抽取出来,新搞个应用(其实就是微服务思想),并且拆分数据库(订单库、用户库)。 5. 分库分表会导致哪些问题分库分表之后,也会存在一些问题:
5.1 事务问题分库分表后,假设两个表在不同的数据库,那么本地事务已经无效啦,需要使用分布式事务了。 5.2 跨库关联跨节点Join的问题:解决这一问题可以分两次查询实现 5.3 排序问题跨节点的count,order by,group by以及聚合函数等问题:可以分别在各个节点上得到结果后在应用程序端进行合并。 5.4 分页问题
5.5 分布式ID数据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑UUID,或者使用雪花算法生成分布式ID。 6. 分库分表中间件目前流行的分库分表中间件比较多:
该文章在 2023/6/28 16:12:38 编辑过 |
关键字查询
相关文章
正在查询... |