面试总被问分库分表怎么办?你可以这样怼他
引言
微服务、分布式大行其道的当下,中、高级Java工程师面试题中高并发、大数据量、分库分表等已经成
了面试的高频词汇,这些知识不了解面试通过率不会太高。你可以不会用,但你不能不知道,就是这么
一种现状。技术名词大多晦涩难懂,不要死记硬背理解最重要,当你捅破那层窗S g V户纸,发现其实它也就
那么回事。
一、为什么要分库分表
关系型数据库以MySK 1 0 ` ` : j fQL为例,单机的8 u & ? 8存储能力、连接数是有限的,它自身就很容易会成为系统的瓶
颈。当单表数据量在百万以 - k H ; C l ^里时,我们还t ; V A C ;可以通过添加从库、优化索引提升性能。一旦数据量朝着千万
以上趋势增长,再怎么优化数据库,很多操作性能仍下降严重。为了减少数据库的 V |负担,提升数据库响
应速度,缩短查询时间,这时候就需要进行分库分表。
二、如何分库分表
分库分表就是要将大量数据分散到多个数据库中,使每个数据库中数据量小响应速度快,以此来提升数
据库整体性能。核心理念就是对数据进行切分P x { : @ x(Sharding),以及切分后如何对数据的快速定位与整合。
针对数据切分类型,大致可以分为:垂直(纵向)切分和水平(横向)切分两种。
1、垂直切分
垂直切分又细分为垂直分库和垂直分表
垂直分库
垂直分库是基于业务分类的,和我们常听到的微服务治理观念很相似,每一个独c k ) 4立的服务都拥有自己的
数据库,需要不同业务的数据需接口调用。而垂直分库也是按照业务分类进行划分,每个业务有独立数
据库,这个比) P 3 a较好理解。
垂直分表
垂直& l & + q分表是基于数据表的列为依据切分的,是一种大表拆小O [ # ~ 7 2表的模式。
例如:一个order表有很多字段,把T = h 4 y O l长度较大且访问不频繁的字段,拆分出来创建一个单独的扩展表work_extend进行存储。
order表:
拆分后
数据库是以行为单位将U M = * | Q 8 S数据加载到内存中,这样拆分以后核心表大多是访问频率较高的P H g 6 Z字段,而且字段
长度也都较短,可以加载更多数据到5 ! % ~ j C G内存中,增加查询的命中率,减少磁盘IO,以此来提升数据库性能。z @ /
优点:
- 业务间解耦,不同业务的数据进行独立的维护、监控、扩展
- 在高并发场景下,一定程度上缓解了数据库的压力
缺点:
- 提升了开发M ~ f ~ 9 [ x的复杂度,由于业务的隔离性,很多F s ) 6 8 v 2 c表无法直接访问,必须通过接口方式聚合数据,
- 分布式事务管理难度增加
- 数据库还是存在单表数据量过大的问题,并未根本上解决,需要配合水平切分
2、水平切分
前边说了垂直切分还是会存& F ) E B e A .在单表数据) Q g量过大的问题,当我们的应用已3 R ~ . q经无法在细粒度的垂直切分时,依旧存在单库读写、存储性能瓶颈,这时就$ ? /要配合水平切分一起了。
水平切分将一张大数据量的表,切分成多个表结构相同,而每个表只占原表一8 3 / C G 7 ~ J -部分` r X数据,然后按不同的条件分散到多个数据库中。
假如一张order表有2000万数据,水平切分后出来四个表,order_1、order_2、order_3、order_4,每张表数据500万,以此类推。
order_1表:
水平切分S ^ y
唯一,所以此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。可
以n k , ! i G j参考我之前写的这篇文章《一口气说出 9种 分布式ID生成方式,面试官有点懵了》
五、分库分表工具?
自己开发分库分表工具的工作量是巨大的,好在业界已经有了很多比较成熟的分库分表中间件,我们可
以将更多的时间放在业务实现上
- sharding-jdbc(当当)
- TShg B M N iarding(蘑菇街)
- Atlas(奇虎360)
- Cobar(阿里巴巴)
- MyCAT(基于Cobar)
- Ocei 1 d g manus(58同城) Vitess(谷k ` & g s % O ,歌)
作者:程序员内点a n 4 U g 9 ?事
链5 , ^ @接:htC ) / u h # btps://juejin.im/post/5e53aa67a $ E P N G - *f265da573L 5 w ub0da9f6