位置:编程技术网 > 数据库 > 正文 >

一文快速入门分库分表(必修课)

2020年10月13日 00:40来源:未知手机版

Q澹崮炱けǎ绱宕捍

巅峰赘婿

原标题:一文快速入门分库分表(必修课)

之前有不少刚入坑Java的粉丝留言,想系统的学习一下分库分表相关技术,可我一直没下定决心搞,眼下赶上公司项目在使用sharding-jdbc对现有MySQL架构做分库分表的改造,所以借此机会出一系分库分表落地实践的文章,也算是自己对架构学习的一个总结。

我在网上陆陆续续的也看了一些有关于分库分表的文章,可发现网上同质化的资料有点多,而且知识点又都比较零碎,还没有详细的实战案例。为了更深入的学习下,我在某些平台买了点付费课程,看了几节课发现有点经验的人看还可以,但对于新手入门来说,其实学习难度还是蛮大的。

为了让新手也能看得懂,有些知识点我可能会用更多的篇幅加以描述,希望大家不要嫌我啰嗦,等这分库分表系列文章完结后,我会把它做成PDF文档开源出去,能帮一个算一个吧!如果发现文中有哪些错误或不严谨之处,欢迎大家交流指正。

具体实践分库分表之前在啰嗦几句,回头复习下分库分表的基础概念。

什么是分库分表

其实分库和分表是两个概念,只不过通常分库与分表的操作会同时进行,以至于我们习惯性的将它们合在一起叫做分库分表。

分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。按照一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。

如何分库分表

分库分表的核心理念就是对数据进行切分(Sharding),以及切分后如何对数据的快速定位与查询结果整合。而分库与分表都可以从:垂直(纵向)和水平(横向)两种纬度进行切分。

下边我们就以订单相关的业务举例,看看如何做库、表的垂直和水平切分。

垂直切分

垂直切分有垂直分库和垂直分表。

1、垂直分库

垂直分库相对来说是比较好理解的,核心理念就四个字:专库专用。

按业务类型对表进行分类,像订单、支付、优惠券、积分等相应的表放在对应的数据库中。开发者不可以跨库直连别的业务数据库,想要其他业务数据,对应业务方可以提供API接口,这就是微服务的初始形态。

垂直分库很大程度上取决于业务的划分,但有时候业务间的划分并不是那么清晰,比如:订单数据的拆分要考虑到与其他业务间的关联关系,并不是说直接把订单相关的表放在一个库里这么简单。

在一定程度上,垂直分库似乎提升了一些数据库性能,可实际上并没有解决由于单表数据量过大导致的性能问题,所以就需要配合水平切分方式来解决。

2、垂直分表

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

例如:一张order订单表,将订单金额、订单编号等访问频繁的字段,单独拆成一张表,把blob类型这样的大字段或访问不频繁的字段,拆分出来创建一个单独的扩展表work_extend,这样每张表只存储原表的一部分字段,再将拆分出来的表分散到不同的库中。

我们知道数据库是以行为单位将数据加载到内存中,这样拆分以后核心表大多是访问频率较高的字段,而且字段长度也都较短,因而可以加载更多数据到内存中,来增加查询的命中率,减少磁盘IO,以此来提升数据库性能。

垂直切分的优点:

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

垂直切分的缺点:

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

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

本文地址:http://www.reviewcode.cn/shujuku/177103.html 转载请注明出处!

今日热点资讯