Java教程

面试总被问分库分表怎么办?你可以这样怼他

本文主要是介绍面试总被问分库分表怎么办?你可以这样怼他,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取

更多优选

引言

微服务、分布式大行其道的当下,中、高级Java工程师面试题中高并发、大数据量、分库分表等已经成

了面试的高频词汇,这些知识不了解面试通过率不会太高。你可以不会用,但你不能不知道,就是这么

一种现状。技术名词大多晦涩难懂,不要死记硬背理解最重要,当你捅破那层窗户纸,发现其实它也就

那么回事。

一、为什么要分库分表

关系型数据库以MySQL为例,单机的存储能力、连接数是有限的,它自身就很容易会成为系统的瓶

颈。当单表数据量在百万以里时,我们还可以通过添加从库、优化索引提升性能。一旦数据量朝着千万

以上趋势增长,再怎么优化数据库,很多操作性能仍下降严重。为了减少数据库的负担,提升数据库响

应速度,缩短查询时间,这时候就需要进行分库分表

二、如何分库分表

分库分表就是要将大量数据分散到多个数据库中,使每个数据库中数据量小响应速度快,以此来提升数

据库整体性能。核心理念就是对数据进行切分(Sharding),以及切分后如何对数据的快速定位与整合。

针对数据切分类型,大致可以分为:垂直(纵向)切分和水平(横向)切分两种。

1、垂直切分

垂直切分又细分为垂直分库垂直分表

垂直分库

垂直分库是基于业务分类的,和我们常听到的微服务治理观念很相似,每一个独立的服务都拥有自己的

数据库,需要不同业务的数据需接口调用。而垂直分库也是按照业务分类进行划分,每个业务有独立数

据库,这个比较好理解。

在这里插入图片描述

垂直分表

垂直分表是基于数据表的列为依据切分的,是一种大表拆小表的模式。

例如:一个order表有很多字段,把长度较大且访问不频繁的字段,拆分出来创建一个单独的扩展表work_extend进行存储。

order表:

id workNo price describe .....
int(12) int(2) int(15) varchar(2000)

拆分后

order核心表:

id workNo price .....
int(12) int(2) int(15)

work_extend表:

id workNo describe .....
int(12) int(2) varchar(2000)

数据库是以行为单位将数据加载到内存中,这样拆分以后核心表大多是访问频率较高的字段,而且字段

长度也都较短,可以加载更多数据到内存中,增加查询的命中率,减少磁盘IO,以此来提升数据库性能。

优点:

  • 业务间解耦,不同业务的数据进行独立的维护、监控、扩展
  • 在高并发场景下,一定程度上缓解了数据库的压力

缺点:

  • 提升了开发的复杂度,由于业务的隔离性,很多表无法直接访问,必须通过接口方式聚合数据,
  • 分布式事务管理难度增加
  • 数据库还是存在单表数据量过大的问题,并未根本上解决,需要配合水平切分
2、水平切分

前边说了垂直切分还是会存在单表数据量过大的问题,当我们的应用已经无法在细粒度的垂直切分时,依旧存在单库读写、存储性能瓶颈,这时就要配合水平切分一起了。

水平切分将一

这篇关于面试总被问分库分表怎么办?你可以这样怼他的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!