开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-分库分表(水平切分)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11242
ShardingSphere-分库分表(水平切分)
内容介绍:
一.水平分库
二.水平分表
本节课进行学习分库分表基本概念,上节课程学习垂直分表,垂直分库。本节课程学习水平分表,水平分库;首先学习水平分库,然后学习水平分表。
一.水平分库
垂直分库是把单一数据库按照业务把数据库划分为多个独立数据库,让数据库做到专库专表。在上节课程例子中:在线教育网站数据库中有两张表,一个是课程表一个是订单表,按照垂直分库原则把课程信息表放到课程数据库中,订单表放到订单数据库中,现在生成两个数据库,第一个是课程数据库,第二个是订单数据库;在课程数据库中有课程基本信息表和课程描述表,在订单数据库中存放订单表,这是上节课程讲的垂直分库。当进行垂直分表然后垂直分库后,依旧存在问题:如果现在随着业务量增加表中数据也会急剧增加,现在虽然做了垂直分表也做了垂直分库,但是现在表中数据依然很大,例如在线教育网站中有几十万,几百万甚至更多课程,那么在课程表中需要存储更多数据,那也会造成进行操作数据库时效率会很低;虽然已经进行垂直分库,垂直分表,但是数据库中数据量大的问题依然没有解决。那么怎么解决问题,如果继续进行使用垂直分表,垂直分库,课程表不能再继续表的划分,也不能继续进行垂直库的划分;即使再对课程数据库进行分库新建一个课程基本信息库和一个课程描述库也不能解决数据量大这一问题。对于这样的问题可以进行水平分库,水平分表。
水平分库:目前问题是 :课程信息都存储在课程数据库中,把课程表进行垂直分表,也是访问一个数据库中的表,数据量大的问题依然存在。那么现在可不可以对数据库进行切分,建多个数据库。例如课程数据库可以建两个数据库,然后让两个数据库分担表中数据多这一问题。做法是:把一个课程数据库切分为两个相同结构数据库,现在有一个数据库,把数据库拆分成两个数据库或者多个数据库,而拆分成的两个数据库结构相同;结构相同:例如现在有一个数据库,拆分后的数据库与之前数据库相同,把课程数据库拆分的第一个数据库命名为课程数据库A,然后再创建一个相同数据库命名为课程数据库B;这两个数据库结构相同,这种方式即水平分库。创建多个相同数据库,再数据库A和数据库B中都存放课程基本信息表,课程描述表;两个数据量内容相同,结构相同;用两个数据库或多个数据库做拆分这种方式即水平分库。
进行水平分库,如何存储数据:需要做特殊处理,举一个简单案例:如果现在需要进行课程信息添加,添加信息需要向表中添加数据,添加完数据课程有ID地址,根据课程ID进行判断:判断课程ID,如果课程ID是偶数把数据添加到课程数据库A中,如果课程ID是奇数把数据添加到课程数据库B中,即再添加数据前进行判断,对数据库中相同表中添加数据。例如使用 id%2判断, 如果运算结果为0表示ID 为偶数, id 值不等于0为奇数,即判断id能否整除2,如果可以整除则 id 为偶数,不能整除则 id 为奇数。如果 id 是偶数向数据库A中添加数据,id是奇数向数据库B 中添加数据。进行部署时,把数据库A与数据库B部署到不同服务器上,数据库中存放相同表的结构;这么做目的是减少数据库中单库单表中的数据,例如现在有十万条数据,在数据库A中存放五万条数据,在数据库B中存放五万条数据,即可做到减少数据库中单库单表中的数据。这种方式叫水平分库。
水平分库做法是把数据库创建多个结构相同数据库,数据库中表相同。在数据库中添加数据,制定规则:当课程 id 为偶数时把数据添加到库存数据库A中,当课程 id 为奇数时把数据添加到数据库B中;数据库A与数据库B结构相同,这种方式叫水平分库。水平分库目的是降低数据库中单库单表中数据量大而造成性能降低的问题。
二.水平分表
水平分表与水平分库相似,水平分库对数据库切分,水平分表对表进行切分;例如现在在操作中完成垂直分表,垂直分库也完成水平分库,完成之后出现问题:不论是多个数据库还是一个数据库,但在数据库中只有一个表,按照水平分库方式划分成多个数据库,数据量中结构相同,这么做后可能还会产生单表数据量过大问题;例如数据库A中课程表有一千万条数据,数据库B中课程表同样有一千万条数据,怎么做并不能根本解决问题,如果现在继续对数据库进行拆分,拆分为更多数据库,但是因为数据库部署在不同服务器上,数据库增多,在进行维护时不方便;针对这中问题,使用水平分表:假设已经进行垂直分表,垂直分库以及水平分库,在课程数据库A中存放课程基本信息表与课程描述表,对表进行水平分表方法:仍然在同一数据库中即数据库A不变,把数据库中的表创建结构相同的多张表,现在数据库A中有两张表:课程基本信息表和课程描述表,在数据库A中创建第一个然后创建相同结构的第二个,相同结构的第三个等等,例如现在创建两个,第一个包括课程基本信息表1和课程描述表1,第二个包括课程基本信息表2和课程描述表2;前提是都在同一数据库中,这么做就叫水平分表。水平分表效果与水平分库相似,假如现在依旧通过课程 id 进行区分:当课程 id 是奇数把数据放到课程基本信息表1和课程描述表1,当课程 id 是偶数把数据放到课程基本信息表2和课程描述表2;与水平分表类似。这样做后好处显而易见:在进行水平分库,水平分表后让每张表中存放数据中的一部分;假如现在有一百万条数据,按照存放规则把一部分数据存放在一张表中,这种方式是水平分表。不论是垂直分表,垂直分库;还是水平分库,水平分表都是为了解决同一问题:减少单库单表中的数据,为了解决因数据量过大性能问题。
水平分表:把一个表拆分成多个结构相同表,按规则向不同表中添加数据。
区别:水平分库后数据库相同;水平分表后表结构相同;垂直分库后数据库不同,数据库中表也不同;垂直分表分为多个不同的表;水平分库,分表后数据库,表相同;垂直分库分表后数据库,表不同;现在已经把分库分表的两种方式基本概念学习了,不需要对概念死记硬背,但要知道这些方式是什么,在什么场景进行使用。