这篇文章的脉络如下:
1、分库分表之前出现的问题
2、怎么分库分表?
3、分库分表的规则是什么?
下面按照这个脉络给出今天的文章。
一、单库单表存在的问题
假设你要设计一个电商网站,在一开始,User表、Order表、Product表等等各种表都在同一个数据库中,每个表都包含了大量的字段。在用户量比较少,访问量也比较少的时候,单库单表不存在问题。
但是公司可能发展的比较好,用户量开始大量增加,业务也越来越繁杂。一张表的字段可能有几十个甚至上百个,而且一张表存储的数据还很多,高达几千万数据,更难受的是这样的表还挺多。于是一个数据库的压力就太大了,一张表的压力也比较大。试想一下,我们在一张几千万数据的表中查询数据,压力本来就大,如果这张表还需要关联查询,那时间等等各个方面的压力就更大了。
(1)单库太大:数据库里面的表太多,所在服务器磁盘空间装不下,IO次数多CPU忙不过来。
(2)单表太大:一张表的字段太多,数据太多。查询起来困难。
此时就开始考虑如何解决问题了。
二、主从复制架构
单库单表下越来越不满足需求,此时我们先考虑进行读写分离。我们将数据库的写操作和读操作进行分离, 使用多个从库副本(Slaver)负责读,使用主库(Master)负责写, 从库从主库同步更新数据,保持数据一致。
这在一定程度上可以解决问题,但是用户超级多的时候,比如几个亿用户,此时写操作会越来越多,一个主库(Master)不能满足要求了,那就把主库拆分,这时候为了保证数据的一致性就要开始进行同步,此时会带来一系列问题:
(1)写操作拓展起来比较困难,因为要保证多个主库的数据一致性。
(2)复制延时:意思是同步带来的时间消耗。
(3)锁表率上升:读写分离,命中率少,锁表的概率提升。
(4)表变大,缓存率下降:此时缓存率一旦下降,带来的就是时间上的消耗。
注意,此时主从复制还是单库单表,只不过复制了很多份并进行同步。
主从复制架构随着用户量的增加、访问量的增加、数据量的增加依然会带来大量的问题,那就要考虑换一种解决思路。就是今天所讲的主题,分库分表。
三、分库分表
不管是分库还是分表,都有两种切分方式:水平切分和垂直切分。下面我们分别看看如何切分。
1、分表
(1)垂直分表
表中的字段较多,一般将不常用的、 数据较大、长度较长的拆分到“扩展表“。一般情况加表的字段可能有几百列,此时是按照字段进行数竖直切。注意垂直分是列多的情况。
(2)水平分表
单表的数据量太大。按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。这种情况是不建议使用的,因为数据量是逐渐增加的,当数据量增加到一定的程度还需要再进行切分。比较麻烦。
2、分库
(1)垂直分库
一个数据库的表太多。此时就会按照一定业务逻辑进行垂直切,比如用户相关的表放在一个数据库里,订单相关的表放在一个数据库里。注意此时不同的数据库应该存放在不同的服务器上,此时磁盘空间、内存、TPS等等都会得到解决。
(2)水平分库
水平分库理论上切分起来是比较麻烦的,它是指将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。
四、分库分表之后的问题
1、主键唯一性处理
需要对表的主键做唯一性处理。
2、需要支持事务
分库分表后,就需要支持分布式事务了。数据库本身为我们提供了事务管理功能,但是分库分表之后就不适用了。如果我们自己编程协调事务,代码方面就又开始了麻烦。
3、跨库join困难
分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表, 结果原本一次查询能够完成的业务,可能需要多次查询才能完成。 我们可以使用全局表,所有库都拷贝一份。
4、结果合并麻烦
比如我们购买了商品,订单表可能进行了拆分等等,此时结果合并就比较困难。
相关推荐
那如何设计可以动态扩容缩容的分库分表方案?”暗示了这个压缩包内容将探讨如何构建一个能够根据需求灵活扩展或收缩的分布式数据库系统。描述中的链接可能是提供更深入讨论的资源,而标签“java”则表明这个方案可能...
高性能数据库集群分库分表方案 本文主要介绍高性能数据库集群分库分表相关理论、基本架构、涉及的复杂度问题以及常见解决方案。 1. 分库分表概述 分库分表是数据库性能优化的重要手段之一,通过将数据库读写操作...
如何设计可以动态扩容缩容的分库分表方案?
MySQL数据库之分库分表方案_ITPUB博客.mhtml MySQL数据库之分库分表方案_ITPUB博客.mhtml MySQL数据库之分库分表方案_ITPUB博客.mhtml
#### 二、MySQL分库分表方案概述 分库分表是针对大型应用中的海量数据进行管理和优化的一种常见策略。其核心目的是通过将大量数据分布在不同的数据库或不同的表中,来降低单一数据库的压力,提高数据处理效率。具体...
### 数据分库分表之二叉树分库分表 #### 一、引言与背景 随着互联网技术的快速发展及用户需求的激增,单一...对于需要处理大量数据的企业而言,合理设计并实施二叉树分库分表方案,能够显著提升系统的性能和稳定性。
在本资源中,我们主要探讨如何使用Spring MVC、Spring和Mybatis这三大流行框架来构建一个支持分库分表的应用。这些技术都是Java Web开发中的关键组件,它们各自承担着不同的职责并协同工作,以实现高效、可扩展的...
开发者在选择和实施分库分表方案时,需要充分评估业务需求、系统架构和现有技术栈,确保方案的可行性和扩展性。此外,持续关注和学习相关工具的发展,可以帮助我们更好地应对大数据时代的挑战。
在IT行业中,数据库扩展是解决高并发、大数据量场景下的常见策略,而“分库分表”正是其中一种有效的手段。本示例“springmvc分库分表实际例子”提供了一个基于SpringMVC实现的实战项目,旨在帮助开发者了解如何在...
MyBatis-Sharding 是一种基于 MyBatis 的轻量级分库分表解决方案,它可以帮助开发者有效地解决亿级数据量下的 MySQL 存储问题。下面将详细介绍 MyBatis-Sharding 的核心概念、实现原理以及如何在实际项目中进行应用...
**MySQL 架构演变** ...选择合适的分库分表方案,如Client模式或Proxy模式,需要综合考虑性能、可维护性和功能需求。Sharding-JDBC和Mycat是其中两种常见的解决方案,它们各有优缺点,适用于不同的应用场景。
本文将详细介绍一款能够自动创建分库分表的工具——“分库分表自动建库表小工具”,并探讨其功能、优势及最新更新内容。 首先,分库分表是一种数据库架构的优化方法,它通过将数据分散存储在多个数据库或表中,来...
"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架的动态数据源功能和MyBatis的SQL映射能力,实现数据库的透明化分片。以下是这个主题的详细知识点: 1. **Spring动态数据...
**四、分库分表的挑战与解决方案** 1. **数据一致性**:分库分表后,事务处理变得复杂,需要考虑分布式事务的实现,如两阶段提交、补偿事务等。 2. **跨库查询**:分库后,部分原先的单表查询变为跨库查询,需要...
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统...
#### 二、分库分表方案 ##### 1. 分表策略 - **目的**:减少单次查询的数据量,提高查询效率。 - **适用场景**: - 数据量巨大,查询效率低下。 - 并发量较大,单一数据库无法支撑。 - **实现方法**: - **范围...
【分库分表入门知识详解】 分库分表是应对大数据量、高并发场景下的数据库优化策略,旨在解决单表数据量...在实践中,需要根据业务特点、数据增长趋势和系统扩展性需求,综合考虑各种因素,选择最合适的分库分表方案。
本项目基于Java、SpringBoot、MyBatis以及ShardingJDBC实现了一个分库分表的解决方案,旨在帮助开发者理解并掌握这一技术。以下是关于这些技术的详细介绍: **Java**: Java是一种广泛使用的面向对象的编程语言,...