✅ 操作成功!

分库分表的几种实现形式 主动转移的基本原则

发布时间:2023-06-16 作者:admin 来源:文学

分库分表的几种实现形式 主动转移的基本原则

分库分表的几种实现形式 主动转移的基本原则

非法获取公民个人信息罪-警察捉小偷

2023年3月3日发(作者:普通)

数据库分区、分表、分库、分⽚

⼀、分区的概念

数据分区是⼀种物理数据库的设计技术,它的⽬的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

分区并不是⽣成新的数据表,⽽是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介⼦中,实际上还是⼀张表。另外,

分区可以做到将表的数据均衡到不同的地⽅,提⾼数据检索的效率,降低数据库的频繁IO压⼒值,分区的优点如下:

1、相对于单个⽂件系统或是硬盘,分区可以存储更多的数据;

2、数据管理⽐较⽅便,⽐如要清理或废弃某年的数据,就可以直接删除该⽇期的分区数据即可;

3、精准定位分区查询数据,不需要全表扫描查询,⼤⼤提⾼数据检索效率;

4、可跨多个分区磁盘查询,来提⾼查询的吞吐量;

5、在涉及聚合函数查询时,可以很容易进⾏数据的合并;

⼆、分类(row⾏,column列)

1、⽔平分区

这种形式分区是对表的⾏进⾏分区,通过这样的⽅式不同分组⾥⾯的物理列分割的数据集得以组合,从⽽进⾏个体分割(单分区)或集体分

割(1个或多个分区)。所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。

举个简单例⼦:⼀个包含⼗年发票记录的表可以被分区为⼗个不同的分区,每个分区包含的是其中⼀年的记录。(朋奕注:这⾥具体使⽤的

分区⽅式我们后⾯再说,可以先说⼀点,⼀定要通过某个属性列来分割,譬如这⾥使⽤的列就是年份)

2、垂直分区

这种分区⽅式⼀般来说是通过对表的垂直划分来减少⽬标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对

应的⾏。

举个简单例⼦:⼀个包含了⼤text和BLOB列的表,这些text和BLOB列⼜不经常被访问,这时候就要把这些不经常使⽤的text和BLOB

了划分到另⼀个分区,在保证它们数据相关性的同时还能提⾼访问速度。

在数据库供应商开始在他们的数据库引擎中建⽴分区(主要是⽔平分区)时,DBA和建模者必须设计好表的物理分区结构,不要保存冗余的

数据(不同表中同时都包含⽗表中的数据)或相互联结成⼀个逻辑⽗对象(通常是视图)。这种做法会使⽔平分区的⼤部分功能失效,有时

候也会对垂直分区产⽣影响。

三、分区、分表、分库的详细理解

⼀、什么是分区、分表、分库

分区

就是把⼀张表的数据分成N个区块,在逻辑上看最终只是⼀张表,但底层是由N个物理区块组成的

分表

就是把⼀张表按⼀定的规则分解成N个具有独⽴存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

分库

⼀旦分表,⼀个库中的表会越来越多

将整个数据库⽐作图书馆,⼀张表就是⼀本书。当要在⼀本书中查找某项内容时,如果不分章节,查找的效率将会下降。⽽同理,在

数据库中就是分区。

⼆、常⽤的单机数据库的瓶颈

问题描述

单个表数据量越⼤,读写锁,插⼊操作重新建⽴索引效率越低。

单个库数据量太⼤(⼀个数据库数据量到1T-2T就是极限)

单个数据库服务器压⼒过⼤

读写速度遇到瓶颈(并发量⼏百)

三、分区

什么时候考虑使⽤分区?

⼀张表的查询速度已经慢到影响使⽤的时候。

sql经过优化

数据量⼤

表中的数据是分段的

对数据的操作往往只涉及⼀部分数据,⽽不是所有的数据

分区解决的问题

主要可以提升查询效率

分区的实现⽅式(简单)

mysql5开始⽀持分区功能

TABLEsales(

UTO_INCREMENT,

DOUBLENOTNULL,

_dayDATETIMENOTNULL,

YKEY(id,order_day)

6.)ENGINE=Innodb

IONBYRANGE(YEAR(order_day))(

IONp_2010VALUESLESSTHAN(2010),

IONp_2011VALUESLESSTHAN(2011),

IONp_2012VALUESLESSTHAN(2012),

IONp_catchallVALUESLESSTHANMAXVALUE);

四、分表

什么时候考虑分表?

⼀张表的查询速度已经慢到影响使⽤的时候。

sql经过优化

数据量⼤

当频繁插⼊或者联合查询时,速度变慢

分表解决的问题

分表后,单表的并发能⼒提⾼了,磁盘I/O性能也提⾼了,写操作效率提⾼了

查询⼀次的时间短了

数据分布在不同的⽂件,磁盘I/O性能提⾼

读写锁影响的数据量变⼩

插⼊数据库需要重新建⽴索引的数据减少

分表的实现⽅式(复杂)

需要业务系统配合迁移升级,⼯作量较⼤

分区和分表的区别与联系

分区和分表的⽬的都是减少数据库的负担,提⾼表的增删改查效率。

分区只是⼀张表中的数据的存储位置发⽣改变,分表是将⼀张表分成多张表。

当访问量⼤,且表数据⽐较⼤时,两种⽅式可以互相配合使⽤。

当访问量不⼤,但表数据⽐较多时,可以只进⾏分区。

常见分区分表的规则策略(类似)

(范围)

(哈希)

3.按照时间拆分

之后按照分表个数取模

5.在认证库中保存数据库配置,就是建⽴⼀个DB,这个DB单独保存user_id到DB的映射关系

12306的订单是如何存储的?

五、分库

什么时候考虑使⽤分库?

单台DB的存储空间不够

随着查询量的增加单台数据库服务器已经没办法⽀撑

分库解决的问题

其主要⽬的是为突破单节点数据库服务器的I/O能⼒限制,解决数据库扩展性问题。

垂直拆分

将系统中不存在关联关系或者需要join的表可以放在不同的数据库不同的服务器中。

按照业务垂直划分。⽐如:可以按照业务分为资⾦、会员、订单三个数据库。

需要解决的问题:跨数据库的事务、jion查询等问题。

⽔平拆分

例如,⼤部分的站点。数据都是和⽤户有关,那么可以根据⽤户,将数据按照⽤户⽔平拆分。

按照规则划分,⼀般⽔平分库是在垂直分库之后的。⽐如每天处理的订单数量是海量的,可以按照⼀定的规则⽔平划分。需要解决的问题:

数据路由、组装。

读写分离

对于时效性不⾼的数据,可以通过读写分离缓解数据库压⼒。需要解决的问题:在业务上区分哪些业务上是允许⼀定时间延迟的,以及数据

同步问题。

思路

垂直分库-->⽔平分库-->读写分离

六、拆分之后⾯临新的问题

问题

事务的⽀持,分库分表,就变成了分布式事务

join时跨库,跨表的问题

分库分表,读写分离使⽤了分布式,分布式为了保证强⼀致性,必然带来延迟,导致性能降低,系统的复杂度变⾼。

常⽤的解决⽅案:

对于不同的⽅式之间没有严格的界限,特点不同,侧重点不同。需要根据实际情况,结合每种⽅式的特点来进⾏处理。

选⽤第三⽅的数据库中间件(Atlas,Mycat,TDDL,DRDS),同时业务系统需要配合数据存储的升级。

七、数据存储的演进

单库单表

单库单表是最常见的数据库设计,例如,有⼀张⽤户(user)表放在数据库db中,所有的⽤户都可以在db库中的user表中查到。

单库多表

随着⽤户数量的增加,user表的数据量会越来越⼤,当数据量达到⼀定程度的时候对user表的查询会渐渐的变慢,从⽽影响整个DB的性

能。如果使⽤mysql,还有⼀个更严重的问题是,当需要添加⼀列的时候,mysql会锁表,期间所有的读写操作只能等待。

可以通过某种⽅式将user进⾏⽔平的切分,产⽣两个表结构完全⼀样的user_0000,user_0001等表,user_0000+user_0001+…的

数据刚好是⼀份完整的数据。

多库多表

随着数据量增加也许单台DB的存储空间不够,随着查询量的增加单台数据库服务器已经没办法⽀撑。这个时候可以再对数据库进⾏⽔平拆

分。

⼋、总结

总的来说,优先考虑分区。当分区不能满⾜需求时,开始考虑分表,合理的分表对效率的提升会优于分区。

九、案例分析

京东的商品评价存储设计,原⽂地址

现状

商品的评论数量:数⼗亿条

每天的服务调⽤:数⼗亿次

每年成倍增长

整体的数据存储:基础数据存储,⽂本存储

基础数据存储

Mysql:只存储⾮⽂本的基础信息。包括:评论状态,⽤户,时间等基础数据。以及图⽚,标签,点赞等附加信息。数据组织形式(不同的

数据⼜可选择不同的库表拆分⽅案):

评论基础数据按⽤户ID进⾏拆库并拆表

图⽚及标签处于同⼀数据库下,根据商品编号分别进⾏拆表

其它的扩展信息数据,因数据量不⼤、访问量不⾼,处理于同⼀库下且不做分表即可

⽂本存储

⽂本存储(评论的内容)使⽤了mongodb、hbase

选择nosql⽽⾮mysql

减轻了mysql存储压⼒,释放msyql,庞⼤的存储也有了可靠的保障

nosql的⾼性能读写⼤⼤提升了系统的吞吐量并降低了延迟

👁️ 阅读量:0