概述
1 分库分表概述
1.1 分库分表是什么?
随着业务的快速发展,数据库中的数据量猛增,访问性能也变慢,优化必不可少。究其原因是关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据容量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引性能仍下降严重。
方案一:
通过提升服务器硬件能力来提高数据处理能力,比如增加存储容量、CPU等,这种方案成本较高,并且瓶颈存在与MySQL本身,即使提高硬件提升也有限。
方案二:
把数据分散到不同的数据库中,使得单一数据库的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的,将一个库拆分成多个数据库,数据量较大的表拆分成多个小表,从而达到数据库性能提升的目的。
分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分成若干数据表组成,是的单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
1.2 分库分表方式(垂直分表)
由于数据的特性不一样,因此考虑将访问频次低的数据特性信息单独放到一张表中(即详情表),访问频次较高的数据特性单独放到一张表中(即主表)。
所以垂直分表的定义:将一个表按照字段分成多个表,每个表存储其中一部分字段。
它带来的提升是:
1、为避免IO挣抢并减少锁表的几率
2、充分发挥热门数据字段的操作效率
1.3 分库分表方式(垂直分库)
垂直分表可以达到一定的性能提升,但是并不能解决数据存储的问题,因为数据还是存在与同一服务器上,垂直分表只是解决了单表数据量过大的问题。查询还是竞争同一物理机器的CPU、内存、网络IO、磁盘等资源。
经过思考,我们可以将原有数据库按照业务功能分为不同的数据库,并将两个数据库分别部署到不同的服务器上,从而达到优化目的。
所以垂直分库的定义:按照业务将表分类,建立不同的数据库,分布到不同的服务器上,它的核心理念是专库专用。
它带来的提升是:
1、解决业务层面的耦合,业务清晰
2、对不同业务的数据进行分级管理、维护、监控、扩展等
3、高并发场景下,垂直分库一定程度提升了IO、数据库连接数、降低了单机硬件资源的瓶颈
1.4 分库分表方式(水平分库)
经过垂直分表、垂直分库后,数据库性能得到极大的提升,但是随着业务系统的推广即业务复杂度的提升,分库后的数据量依旧到达了瓶颈,单台的服务器已经无法支撑,此时就要考虑利用多台服务器达到压力水平分布的效果。
所以水平分库的定义:把同一个数据库按照一定的规则拆分成不同分数据库,拆分的数据库保持表结构相同,每个库分布到不同的服务器上。
它带来的提升:
1、解决了单库大数据,高并发的性能瓶颈
2、提高了系统的稳定性及可用性
1.5 分库分表方式(水平分表)
经过垂直分表、垂直分库、水平分库后,单表的业务数据依旧很大,这时候我们可以参照水平分库的思想,把单表数据过大的表拆分成若干小表,表结构相同,依据一定的规则控制数据的流向。
所以水平分表的定义:在同一数据库内,把同一表的数据按照一定规则拆分到多个表中。
它带来的提升是:
1、优化单一表数据量过大而产生的性能问题
2、避免IO挣抢并减少锁表的几率
1.6 分库分表带来的问题
1.6.1 事务一致性问题
由于分库分表把数据分布在不同库甚至不同服务器上,不可避免会带来分布式事务问题。
1.6.2 跨节点关联查询
没有分库分表前,我们关联查询多个表在一个库一台机器上,分库分表后,数据分布在不同的库甚至不同服务器上,无法进行关联查询。
解决思路:将原有关联查询拆分成多次请求查询,利用关联ID分次获取数据后在对数据进行拼装。
1.6.3 跨节点分页、排序函数
跨节点多库进行查询时,limit分页、order by排序等问题,就会变得比较复杂了,需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果汇总再排序。
1.6.4 主键避重
分库分表环境中,由于表数据存在不同库中,主键使用平时的自增将无用武之地,因此需要单独设计全局主键,以避免跨库主键重复问题。
1.6.5 公共表
实际业务场景中,针对参数、字典等数据量较小、变动少,而且属于高频联合查询依赖的表,我们会建立为公共表。
分库分表环境中,我们可以将这些表在每个数据库中都保存一份,所有对公共表的操作都同时发送到所有分库执行。
最后
以上就是谨慎路人为你收集整理的Sharding-JDBC分库分表从入门到熟练(1)的全部内容,希望文章能够帮你解决Sharding-JDBC分库分表从入门到熟练(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复