分库分表
关系型数据库容易造成性能瓶颈,单机存储容量,连接数,处理能力都有限。(当单表数据量达到1000w或100G以后),当查询维度较多时,即使添加从库,优化索引等性能仍下降严重,此时可以考虑进行数据库拆分,拆分目的在于减少数据库的负担,缩短查询时间。
数据库分布式的核心内容关键是数据切分(Sharding)及切分后对数据的定位,整合。将数据分散到各个数据库中,使得每一数据库的性能达到较好的状态,达到提升数据库操作性能的目的。
切分类型: 垂直切分和水平切分
垂直切分常见有垂直分库和垂直分表
垂直分库:
根据 业务耦合性, 将关联度低的不同表存储在不同数据库中。
垂直分表:
基于数据库中的 列 进行,某个表字段多,可以新建一张扩展表,将不常用或字段长度较大的字段拆分出去到扩展表中,通过 大表拆小表 ,便于开发与维护,也能避免 跨页问题 (在分页查询时,如果有大量数据的情况下,可能会出现跳页或漏页的情况,MySQL底层通过数据页存储,一条记录占用空间过大会导致跨页,造成额外的性能开销)
这种拆分方式主要基于字段的逻辑关系和使用频率等考虑因素,将不同的字段分布到不同的表中,以提高查询性能和减少数据冗余。
注意: 垂直分表也会带来一些挑战,包括处理跨表查询的复杂性、维护数据一致性和关联性等。在使用垂直分表时,需要综合考虑具体的业务需求、查询模式和数据特点,设计合适的分表策略,并在应用层级上处理相关的数据关联和查询操作。
水平切分:
它将一个数据库中的数据按照某种规则分散到多个独立的数据库或多个表中。每个表都包含部分数据行,从而实现数据的分布式存储和处理。
常用切分规则:
1.范围切分:根据数据范围将数据划分到不同的节点,例如可以根据用户ID的范围进行划分,节点1存储用户ID从0到10000的数据,节点2存储用户从10000到20000的数据。
2.散列切分:使用数据的散列值来确定数据应该存储在哪个节点上,使用散列函数对某个数据属性进行散列计算,并将结果映射到节点ID,保证数据在节点上均匀分布。
分库分表带来的问题:
1.数据一致性:在分库分表环境下,数据的一致性变得更加复杂。跨多个数据库或表的事务操作变得更加困难,需要采用分布式事务或其他一致性保证机制来确保数据的一致性。
2.跨节点查询:当需要跨多个数据库或表进行查询时,性能会受到影响。跨节点查询可能需要在多个节点上进行并行查询,增加了网络开销和响应时间。
3.数据迁移和扩缩容:在分库分表环境中,数据的迁移和节点的扩缩容变得复杂。当需要增加或减少节点时,需要进行数据迁移和重新分片,这涉及到数据的重新分布和迁移,可能导致服务中断、数据不一致等问题。
4.跨节点事务:在分库分表环境中,跨多个数据库或表的事务操作变得更加复杂。保持跨节点事务的原子性和一致性需要使用分布式事务或其他协调机制,增加了系统的复杂性和开发的难度。
5.查询和分析复杂性:在分库分表环境中,对于需要跨多个数据库或表进行查询和分析的复杂查询操作变得更加困难。需要使用联合查询、分布式计算等技术来处理分片的数据,并进行结果的合并和处理。
6.应用层逻辑复杂性:分库分表会引入应用层的逻辑复杂性。应用程序需要处理数据的分布和路由逻辑,管理多个数据库连接和事务,并处理跨节点查询和一致性问题。
7.数据倾斜:在分库分表环境中,数据可能会出现不均匀分布的情况,导致某些节点或表的负载过重,而其他节点或表的负载较轻。这可能影响系统的性能和可扩展性,需要进行负载均衡和数据重分布的优化。