mysql的分表和分库
分表:
1.水平分表
同一个表,同时创建多个,再存入数据的时候,可以根据不同的id取余来存入不同的表中中,这些表都是一样的,主要是分担表的压力。
2.垂直分表
根据不同字段,分出字段,例如一个用户表,里面有用户名,手机号,地址
分成三个表:分别存储用户名,手机号,地址,也是分担表压力的形式
分库
1.水平分库
水平分库是指将一个数据库按照某种规则(通常是数据的某个特征)拆分成多个数据库,每个数据库分别存储一部分数据。
解决什么问题:
解决单个数据库存储量过大或者负载过高的问题,通过分散数据存储和查询的压力,提高数据库的性能和扩展性。
步骤:
一句话:选定一个条件字段,然后传入的数据,根据条件字段,进行分库存储,每一个数据库的结构都是一样的,但是存储的信息,都是被划分好了的。
- 确定分库规则:
- 在进行水平分库之前,首先需要确定合适的分库规则。这个规则通常是根据数据的某个特征进行划分,比如按照用户 ID、地理位置、时间范围等将数据分配到不同的库中。
- 创建分布式架构:
- 在确定了分库规则之后,需要搭建相应的分布式架构。这通常包括多个数据库节点,每个节点负责存储和处理一部分数据。同时,还需要一个负载均衡器来将请求分发到不同的数据库节点上。
- 数据迁移:
- 数据迁移是水平分库的关键步骤之一。在迁移数据之前,需要先对数据进行划分,根据分库规则将数据分配到不同的数据库节点上。然后,通过数据迁移工具将现有数据库中的数据按照规则迁移到对应的数据库节点上。
- 维护和扩展:
- 一旦完成了水平分库,就需要对分布式架构进行维护和监控,确保各个数据库节点的正常运行和数据一致性。另外,随着业务的增长,可能需要不断扩展数据库节点的数量,以满足更高的负载需求。
举例
假设我们有一个在线社交网络平台,其中包含用户信息、帖子信息和评论信息等多个数据集。我们可以使用水平分库的方式将这些数据集按照用户 ID 进行分库,以提高系统的性能和扩展性。
具体地,我们可以将用户信息、帖子信息和评论信息分别存储在不同的数据库中,每个数据库根据用户 ID 进行分库:
- 用户信息数据库:
- 包含用户的基本信息、个人资料、好友列表等。这些信息通常与用户 ID 相关联,并且在用户登录、个人主页访问、好友交互等场景下会频繁访问。因此,我们可以将用户信息根据用户 ID 的哈希值分散到多个数据库节点上,并且根据需要动态调整数据库节点的数量,以应对用户数量的增长和访问压力的变化。
- 帖子信息数据库:
- 包含用户发布的帖子、动态、文章等信息。这些信息也通常与用户 ID 相关联,并且在用户浏览帖子、点赞评论等场景下会频繁访问。因此,我们可以将帖子信息根据用户 ID 的哈希值分散到多个数据库节点上,并且使用分布式数据库来处理大量的帖子数据和高并发的帖子操作。
- 评论信息数据库:
- 包含用户对帖子的评论、回复、点赞等信息。这些信息同样与用户 ID 和帖子 ID 相关联,并且在用户浏览评论、发布回复等场景下会频繁访问。因此,我们可以将评论信息根据用户 ID 和帖子 ID 的哈希值分散到多个数据库节点上,并且使用缓存技术来加速评论数据的访问和展示。
通过将不同的数据集按照用户 ID 进行水平分库,我们可以根据实际的业务需求和访问模式来优化每个数据库的设计和架构,提高系统的性能和可用性。同时,也可以更灵活地扩展每个数据库的容量和性能,以满足不同数据集的不同需求。
2.垂直分库
概念
垂直分库是指根据数据的特征将一个数据库中的不同表或不同数据集分布到不同的数据库中。
与水平分库区别
垂直分库是根据数据的功能或者业务逻辑进行划分,而不是根据数据的某个特征进行划分。
解决问题
通常用于解决数据库结构复杂、查询压力不均衡或者数据访问频率差异较大的情况。
使用步骤
一句话,不同的表放入不同的数据库中。
以下是垂直分库的一般步骤和原理:
- 分析数据库结构:
- 在进行垂直分库之前,首先需要对数据库的结构进行分析,了解各个表之间的关系和数据访问的模式。通常会根据表的功能、访问频率、数据量等因素进行评估和判断。
- 划分数据集:
- 根据分析结果,将数据库中的不同表或不同数据集划分为若干个逻辑上相关的组,每个组包含一组相关的数据表。这些组可以根据业务功能、访问频率、数据量等因素进行划分。
- 创建分布式架构:
- 在确定了数据集划分之后,需要搭建相应的分布式架构。这通常包括多个数据库节点,每个节点负责存储和处理一组相关的数据表。同时,还需要一个负载均衡器来将请求分发到不同的数据库节点上。
- 数据迁移:
- 数据迁移是垂直分库的关键步骤之一。在迁移数据之前,需要先对数据集进行划分,然后通过数据迁移工具将现有数据库中的数据按照划分规则迁移到对应的数据库节点上。
- 维护和扩展:
- 一旦完成了垂直分库,就需要对分布式架构进行维护和监控,确保各个数据库节点的正常运行和数据一致性。另外,随着业务的增长,可能需要不断扩展数据库节点的数量,以满足更高的负载需求。
举例
- 用户信息数据库:
- 包含用户的基本信息、账号信息、地址信息等。这些信息通常不会经常改变,但是在用户登录、注册、修改信息等操作时会频繁访问。因此,我们可以将用户信息单独存储在一个数据库中,并且使用高性能的数据库引擎来保证快速的数据访问。
- 订单信息数据库:
- 包含用户的订单信息、交易记录、支付信息等。这些信息会随着用户的购买行为不断产生,并且在订单查询、支付确认、物流跟踪等场景下会频繁访问。因此,我们可以将订单信息单独存储在一个数据库中,并且使用分布式数据库来处理大量的订单数据和高并发的订单操作。
- 产品信息数据库:
- 包含产品的基本信息、库存信息、价格信息等。这些信息在用户浏览商品、下单购买、库存管理等场景下会频繁访问。因此,我们可以将产品信息单独存储在一个数据库中,并且使用缓存技术来加速商品数据的访问和展示。
通过将不同的数据集分别存储在不同的数据库中,我们可以根据实际的业务需求和访问模式来优化每个数据库的设计和架构,提高系统的性能和可用性。同时,也可以更灵活地扩展每个数据库的容量和性能,以满足不同数据集的不同需求。
总结
水平分:数据的结构不变,主要是选择一个字段,一般为id,根据id区间,进行存储,表就存储不同的表中,库就存储不同的库中。
垂直分:需要拆分结构了。表就拆分字段,库就拆分表。