开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-分库分表小结和问题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11243
ShardingSphere-分库分表小结和问题
内容介绍:
一.分库分表小结
二.分库分表应用与问题
前面两节课程已经学习分库分表中的基本概念,下面对分库分表做总结并且说明分库分表产生的问题。
一.分库分表小结
垂直分表:把一张表中一部分字段数据存到一张表中,再把这张表另一部分字段数据存到另外一张表中。例如课程表中课程基本信息与课程描述,把课程表拆分为课程基本信息表与课程描述表;垂直分表只是对一张表进行拆分,并不能根本上解决数据量多这一问题;可以进行垂直分库,垂直分库把单一数据库按照业务进行划分为多个独立数据库,做到专库专表;例如课程与订单分为两个不同数据库,其中放专门的表,部署在不同服务器中;这么做会产生一系列问题。会进行水平分库,把数据库创建结构相同数据库,其中存放相同表,把数据存放在不同数据库中;最后水平分表做法是,在一个相同数据库中创建多个相同结构的表,在表中平均存放不同数据。前两种方式都是针对结构发生变化或者发生修改,而水平分库与水平分表按照字段,按照数据量进行不同的显示,例如把每一万存到不同表中,每一万存到不同库中,这是两种不同的方式,一个垂直改变结构一个水平改变数据量,这是分库分表两种方式:垂直拆分,水平拆分。
二.分库分表应用与问题
分库分表两种方式:垂直拆分,水平拆分在实际情况先如何使用?是全部使用还是使用一部分。
1.应用
(1)在数据库设计时考虑垂直分库和垂直分表,即在设计数据库时需要考虑那些表需要拆分,那些库需要拆分。第一部分在设计时考虑垂直分库分表。
(2)随着数据库数据量增加,不要马上考虑做水平切分,如果数量增加首先考虑缓存处理,读写分离,使用索引等等方式,如果这些方式不能根本解决问题了,再考虑做水平分库和水平分表:创建多个结构相同数据库或多个结构相同的表。这些需要掌握。
2.分库分表问题
任何事务都具有两面性,任何事情都有优点和缺点;在进行分库分表优点是可以很好的解决单库单表数据量大这一问题,造成读写效率低的问题;当然进行分库分表后会带来不好的问题:
(1) 跨节点连接查询问题,或者说跨节点索引问题。那么这个问题是什么,举例:现在进行垂直分库操作后,有两个数据库一个数据库为课程数据库一个数据库为订单数据库,在课程数据库中有课程基本信息表与课程描述表,在订单表中有订单表;如果现在需要查询课程表中与订单表中相关联数据,查询数据中既包含课程数据又包含订单数据,假设查询数据中包含:订单号,订单金额(订单一共花费多少),课程名称,课时数,或者其他信息。在查询这一数据是只查询课程表或订单表都无法查询,只有两张表相关联时才能查询,但是两张表在不同数据库中,数据库又在不同的服务器中。无法直接关联,因为数据即在不同服务器中又在不同数据库中;在查询时需要首先根据课程号查询课程基本信息或者根据订单号查询订单信息,然后在订单表中看到存储课程信息,使用课程id 在课程表中查询数据。需要分为多次查询,在多次查询过程中还需要查询多个服务器中多个数据库中表的数据,这一过程虽然可以实现但同样是分库分表带来的问题。
假设查询数据中包含:订单号,订单金额(订单一共花费多少),课程名称,课时数,或者其他信息。这些数据包含在两张表中,单独查询一张表无法查询出数据,查询这一数据需要查询多次,第一次根据订单号查询订单信息在订单信息中有订单id ,第二次根据课程id在课程表中查询才可以查询这一数据。在查询过程中需要查询多次数据库,把多次查询的数据进行汇总最终才能得到数据。这一过程比较繁琐,是分库分表带来的问题。如果在操作过程中进行分页,排序,那么这一过程同样比较麻烦:方案同样是在两个数据库中把数据查询出后进行汇总,汇总之后再进行分页或者排序。这一问题是分库分表带来跨节点连接查询问题其中包括分页问题和排序问题。
(2)多数据源管理问题:现在有多个数据库,多个数据库又在不同服务器中,再操作中需要管理多个数据源。假设课程数据库在192.168.1.1的服务器中,订单数据库在192.168.1.2的服务器中,需要对多个数据库中数据源进行管理或者更多数据源,管理数据源过程肯定繁琐。
使用分库分表能够让单库单表数据量降低包括提高访问效率,另外也带来问题:第一个问题是跨节点连接查询问题包括分页查询和排序,第二个是多数据源管理问题。下一节课程 ShardingSphere 中 jdbc 能够很好解决分库分表问题。到这里完成 ShardingSphere 的基本概念的讲解:包括什么是 ShardingSphere?什么是分库分表,分库分表应用场景以及分库分表带来的问题。