发明内容
本发明的实施例提供一种处理数据表的方法及装置,能够降低服务器的运行的负载。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明的实施例提供的方法,包括:将待存储的数据导入数据库实例,并根据当前时间段对应的分表规则,在所述数据库实例中拆分出至少两张分表;生成所得分表的主键ID,并导入分表索引表,所述主键ID中包括:用于表示数据被存储时的时间维度的信息;当接收到查询请求时,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据。
结合第一方面,在第一方面的第一种可能的实现方式中,所述将待存储的数据导入数据库实例,包括:将待存储的数据按照预设比例拆分并导入至少两个数据库实例,其中,一个数据库实例对应一个用户单号。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述生成所得分表的主键ID并导入分表索引表,包括:根据数据被存储时的时间段得到时间字段;生成包括了所述时间字段、分库索引字段和识别字段的主键ID,所述分库索引字段包括:会员ID或订单号,所述识别字段包括分表创建时的唯一性标识。
结合第一方面的第一种可能的实现方式,在第三种可能的实现方式中,所述查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据,包括:根据所述主键ID查询所述分表索引表得到分表名,并根据所述分表名确定所述分表所在分库的分库序号;根据所述主键ID确定所述分表对应的时间段,并从分表配置表中查询所述分表对应的时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则;依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述分表所在分库的数据。
结合第一方面的第一种可能的实现方式,在第四种可能的实现方式中,所述查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据,包括:获取所述时间段内对应的各分表的主键ID,并查询所述分表索引表得到所述时间段内对应的各分表的分表名,并根据所述各分表的分表名确定各分表所在分库的分库序号;从分表配置表中查询所述时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则;遍历分表名数组和分库数组,并依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述时间段内对应的各分表所在分库中的数据。
结合第一方面的第四种可能的实现方式,在第五种可能的实现方式中,所述获取所述时间段内对应的各分表的主键ID,包括:确定分页对应的时间段,并获取所述分页对应的时间段内对应的各分表的主键ID;所述遍历分表名数组和分库数组,包括:按照所述分页遍历分表名数组和分库数组。
结合第一方面,在第一方面的第六种可能的实现方式中,还包括:将已存储的数据迁移至所述数据库实例;利用所述已存储的数据被存储时的时间段和对应的分表规则,更新所述已存储的数据的分表的主键ID,并在更新后导入分表索引表。
第二方面,本发明的实施例提供的装置,包括:
分库分表模块,用于将待存储的数据导入数据库实例,并根据当前时间段对应的分表规则,在所述数据库实例中拆分出至少两张分表;
主键管理模块,用于生成所得分表的主键ID,并导入分表索引表,所述主键ID中包括:用于表示数据被存储时的时间维度的信息;
访问管理模块,用于当接收到查询请求时,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据。
结合第二方面,在第二方面的第一种可能的实现方式中,所述分库分表模块,具体用于将待存储的数据按照预设比例拆分并导入至少两个数据库实例,其中,一个数据库实例对应一个用户单号;
所述主键管理模块,用于根据数据被存储时的时间段得到时间字段;并生成包括了所述时间字段、分库索引字段和识别字段的主键ID,所述分库索引字段包括:会员ID或订单号,所述识别字段包括分表创建时的唯一性标识;
所述访问管理模块,用于根据所述主键ID查询所述分表索引表得到分表名,并根据所述分表名确定所述分表所在分库的分库序号;并根据所述主键ID确定所述分表对应的时间段,并从分表配置表中查询所述分表对应的时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则;再依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述分表所在分库的数据;
所述访问管理模块,还用于获取所述时间段内对应的各分表的主键ID,并查询所述分表索引表得到所述时间段内对应的各分表的分表名,并根据所述各分表的分表名确定各分表所在分库的分库序号;并从分表配置表中查询所述时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则;再遍历分表名数组和分库数组,并依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述时间段内对应的各分表所在分库中的数据。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述分库分表模块,还用于将已存储的数据迁移至所述数据库实例;并利用所述已存储的数据被存储时的时间段和对应的分表规则,更新所述已存储的数据的分表的主键ID,并在更新后导入分表索引表。
本发明实施例提供的处理数据表的方法及装置,当读取新存入的数据时,可以根据新存入的数据的存入时间获取新存入数据的分表规则;当读取老数据时,可以根据老数据的存入时间获取老数据的分表规则,即实现了不同的数据通过各自对应的分表规则进行读取,由于数据格式可能存在不同,因此不同的数据各自对应的分表规则可以互不相同。而不需要采用现有技术中:为了使得不同的数据统一分表规则,在每一次刷新后关系型数据库需根据最新的分表规则重新执行维护流程的方案,从而实现了对于不同的数据格式以及不同种类数据格式、分表策略的兼容。提高了关系型数据库中,数据库表的并发处理能力以及表容量,也降低数据维护的成本。
具体实施方式
为使本领域技术人员更好地理解本发明的技术方案,下面结合附图和具体实施方式对本发明作进一步详细描述。下文中将详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的任一单元和全部组合。本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。
本发明实施例的方法流程,具体可以在关系型数据库中执行,该关系型数据库具体可组建在服务器、工作站、超级计算机等设备上,或者可组建在由多个服务器组成的服务器集群上。本实施例提供一种处理数据表的方法,如图1所示,包括:
S1、将待存储的数据导入数据库实例,并根据当前时间段对应的分表规则,在所述数据库实例中拆分出至少两张分表。
其中,待存储的数据可以理解为新存储如入关系型数据库中的数据,这些数据可以来源于与关系型数据库建立了信息传输通道的在线购物平台、在线金融交易平台、物流关系系统等用于在线业务服务的系统,也可以是具备其他业务功能的业务系统。
在本实施例中,所述将待存储的数据导入数据库实例的具体方式,包括:将待存储的数据按照预设比例拆分并导入至少两个数据库实例,其中,一个数据库实例对应一个用户单号。其中用户单号可以理解为对应了一个用户的单号,单号具体可以是一种用于表示订单编号、物流编号、或者交易编号等识别性编号。例如:参照本实施例,可以在epp-core核心库基础上,增加分库分表相关读写功能,从而得到如图2所示的一种数据库分表设计,其中各字段的定义与功能如表1所示。
表1
从而将待存储的数据按预设比例拆分到多个数据库实例,每个实例拆分为多张分表,其中,预设比例可以根据关系型数据库的负载情况设定,从而通过多库多表的方式极大地提高了并发处理能力以及表容量。分表规则基于不同的时间段对应不同的分表规则,并在数据查询时,按照不同时间段的分表规则进行读取,从而实现在不对数据进行重新整理的情况下,依然完成数据的更新、存储和读取的过程。
S2、生成所得分表的主键ID,并导入分表索引表。
其中,所述主键ID中包括:用于表示数据被存储时的时间维度的信息。
S3、当接收到查询请求时,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据。
其中,访问请求可以来自与关系型数据库通信的外部设备,也可以是由关系型数据库中的用于数据维护的服务器或者其他设备发出,访问数据的方式具体包括:通过主键ID访问数据,并进行读/写指定的数据内容的操作。需要说明的是,在确认了数据的分表规则后,可以通过常用的手段依据分表规则访问数据。其中,读/写操作至少包括了查询/更新/删除等操作。
本发明实施例提供的处理数据表的方法,当读取新存入的数据时,可以根据新存入的数据的存入时间获取新存入数据的分表规则;当读取老数据时,可以根据老数据的存入时间获取老数据的分表规则,即实现了不同的数据通过各自对应的分表规则进行读取,由于数据格式可能存在不同,因此不同的数据各自对应的分表规则可以互不相同。而不需要采用现有技术中:为了使得不同的数据统一分表规则,在每一次刷新后关系型数据库需根据最新的分表规则重新执行维护流程的方案,从而实现了对于不同的数据格式以及不同种类数据格式、分表策略的兼容。提高了关系型数据库中,数据库表的并发处理能力以及表容量,也降低数据维护的成本。
在本实施例中,提供一种生成所得分表的主键ID并导入分表索引表的具体方式,以及提供一种本实施例方案中一种可能的主键ID的具体格式,其中包括:根据数据被存储时的时间段得到时间字段。并生成包括了所述时间字段、分库索引字段和识别字段的主键ID。
其中,所述分库索引字段包括:会员ID或订单号,所述识别字段包括分表创建时的唯一性标识。例如:
主键ID格式:主键ID为指定位数的数字或字符,格式为:{yymmdd}{user4}{sequence9},其中:
1、yymmdd:6位年月日,如140620,作为主键ID中表示时间维度的信息。
2、user4:会员ID的后四位,作为分库索引字段,也可以使用其他大于4位的平均分布数据,如业务订单ID。
3、sequence9:原表的sequence后9位,每个分表使用各自的sequence,这些sequence随着分表一起创建,用于保证单号唯一。
例如:如图3所示的,单笔数据(或称单份数据)进行新增操作时,DAO(Data AccessObject,数据访问对象)层调用数据访问工具(比如表2所示的单笔数据访问分表工具),传入时间字段,用来作为分表的依据,其中,时间字段用于表示当前时刻,并传入分库索引字段,如会员ID,作为分库依据。数据访问工具触发分表索引组件生成主键ID,并查询分表信息。并由分表索引组件向数据访问工具返回生成的主键ID、分库序号(比如表1中的DataBase1、DataBase2的序号“1,2”)以及分表名。之后由数据访问工具设置用于数据插入的分库会话,执行分库会话并将单笔数据插入关系型数据库,执行完毕后,由数据访问工具向DAO层返回执行结果。本实施例中所述的DAO层,可以理解为与数据库表结构直接对应的一层,并在DAO层实现对数据库的增加、删除、更改,查询的CRUD功能。
再例如:如图4所示的,批量数据进行新增操作时,DAO层调用数据访问工具(比如表2所示的批量数据访问分表工具),传入时间字段,用来作为分表的依据,其中,时间字段用于表示当前时刻,并传入分库索引字段,如会员ID,作为分库依据。数据访问工具触发分表索引组件批量生成主键ID,并查询分表信息。并由分表索引组件向数据访问工具返回生成的主键ID组(包括批量生成的多个主键ID)、分库序号以及分表名,其中,若无起始主键ID或存在更小的主键ID,则维护分表索引。之后由数据访问工具遍历多个分库并在相应的分库中设置用于数据插入的分库会话,执行各个分库会话并将批量数据分别插入关系型数据库的分库中,执行完毕后,由数据访问工具向DAO层返回执行结果。其中,批量数据可以异步执行插入各分库中的过程,并等所有批量数据插入完毕后由数据访问工具向DAO层返回执行结果。
其中,批量数据可以理解为包括了多个单笔数据(或称单份数据)的数据的集合。在批量新增数据时,由分表索引组件批量生成主键ID数组,并返回至批量数据访问工具,批量访问工具执行预编译的批量SQL(Structured Query Language,结构化查询语言),从而保证事务一致性和高性能。批量数据访问分表工具可以索引时间段为关键字,跨多张分表数据库执行CRUD操作,其中CRUD操作可以理解为访问数据库时进行的增加、删除、更改,查询等操作。通过时间段(从每张分表对应的开始时间至结束时间),并且依据相关的分表索引信息,查询出需要执行的多张分表,例如:由于分表是按照时间进行,每张分表都有对应的开始时间和结束时间,通过当前数据的时间字段,确认这条数据所在的分表。再依据分库索引字段,找到对应的分库,并且在工具中按顺序执行相关SQL,统一汇总结果信息并返回。在本实施例中,分表索引组件用于依据分表配置表和分表索引表执行相关操作,分表配置表中记录并维护了分库分表相关的分表表名和分表规则,分表索引表中记录并维护了每个分表的日期范围等信息。分表索引组件同时还用于定期检查是否存在空闲的分表,并且按照规则创建分表索引数据,对分表进行业务监控,并及时发现新的分表,以便及时维护新的分表。
在实际应用中,分表索引组件可以实现在原有的Dao层的Mybatis实现中,通过增加分表工具类,提供相关分表的增、删、改、查功能,动态判断数据所在的分表,实现对分表的数据访问和读写操作。分库索引组件和分表索引组件也可以集成在分库分表索引组件中,例如:分库分表索引组件,以及上述的单笔数据访问分表工具和批量数据访问分表工具的功能和执行方式,如表2所示:
表2
在本实施例中,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据的具体方式,包括:
根据所述主键ID查询所述分表索引表得到分表名,并根据所述分表名确定所述分表所在分库的分库序号。并根据所述主键ID确定所述分表对应的时间段,并从分表配置表中查询所述分表对应的时间段的分表规则。再依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述分表所在分库的数据。
其中,所述分表配置表用于记录各分表的分表名和分表规则。
例如:如图5所示的,单笔数据(或称单份数据)访问时,DAO层调用数据访问工具,数据访问工具通过主键ID查询并获取分表名;由分表索引组件根据分表名确定分表所在分库的分库序号,并将分库序号和分表名传回数据访问工具。之后根据主键ID确定分表对应的时间段,并从分表配置表中查询分表对应的时间段的分表规则。再依据查询得到的分表规则,由数据访问工具设置用于数据查询、更新或删除的分库会话,执行分库会话并执行数据查询、更新或删除操作,执行完毕后,由数据访问工具向DAO层返回执行结果。
可选的,在本实施例中,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据的具体方式,还包括:
获取所述时间段内对应的各分表的主键ID,并查询所述分表索引表得到所述时间段内对应的各分表的分表名,并根据所述各分表的分表名确定各分表所在分库的分库序号。
从分表配置表中查询所述时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则。
遍历分表名数组和分库数组,并依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述时间段内对应的各分表所在分库中的数据。
例如:如图6所示的,批量修改数据时,DAO层调用数据访问工具,获取所述时间段内对应的各分表的主键ID,数据访问工具通过查询所述分表索引表得到所述时间段内对应的各分表的分表名,由分表索引组件根据所述各分表的分表名确定各分表所在分库的分库序号。并将分库序号和分表名数组(分表名数组包括了各分表的分表名)传回数据访问工具。由数据访问工具遍历分表名数组和分库数组,并依据查询得到的分表规则设置用于数据查询、更新或删除的分库会话,执行所述分库会话并执行数据查询、更新或删除等修改操作。执行完毕后,由数据访问工具向DAO层返回执行结果。其中,与分页查询类似,批量查询、更新或删除,需要依据时间段来计算需要执行SQL的多张分表。并且,同一批次进行批量查询、更新或删除操作的所有数据保持在一个事务中。例如:本实施例中,执行预编译的批量SQL的具体方式可以采用关系型数据库的事务特性,每个数据库连接可以开启一个事务,在单个数据库中,连续执行多条SQL语句,并一次性提交,结束事务,若提交失败则会全部回滚。
进一步的,考虑到代码的健壮性,以及时间业务场景,批量查询可以通过分页查询的方式实现,从而降低批量查询带来的大数据量的内存溢出风险。在本实施例中,所述获取所述时间段内对应的各分表的主键ID,具体可以实现为:确定分页对应的时间段,并获取所述分页对应的时间段内对应的各分表的主键ID。
所述遍历分表名数组和分库数组,具体可以实现为:按照所述分页遍历分表名数组和分库数组。其中,在执行分页查询时,通过时间段来计算涉及的多张分表,通过分库索引字段来计算所在的分库(或称为数据库实例)。在批量数据访问工具中,依次执行计数SQL,计算总数据量。再按照当前请求的数据,执行相关的数据查询,汇总结果集并返回。在本实施例中,在查询列表时,可以先查询列表的长度,然后按照分页大小和页数,查询指定条数的数据。
在本实施例中,还包括对已存储的数据的处理方式,其中,已存储的数据在本实施例中可以简称为老数据,所述的待存储的数据可以理解为当前准备存储的数据且会在生成的主键ID中包括了上述的数据被存储时的时间维度的信息。对已存储的数据的处理方式包括:
将已存储的数据迁移至所述数据库实例。并利用所述已存储的数据被存储时的时间段和对应的分表规则,更新所述已存储的数据的分表的主键ID,并在更新后导入分表索引表。
在本实施例中,若老数据迁移之后,可以维护老数据的相关主键ID信息到分表索引表中。其中,老数据可以理解为已在关系型数据库中存储,且并为按照本实施例中的主键ID格式生成相应的主键ID,比如上述示例中的格式{yymmdd}{user4}{sequence9},以便于在访问数据时,能够通过主键ID确认时间段并获取老数据在存储时的分表规则读取老数据。而新存入的数据,比如所述待存储的数据,可以在得到分表后,分表索引组件统一生成所得分表的主键ID,并可以通过单号来识别分表,从而实现了对新老数据格式以及分表策略进行兼容。
当读取新存入的数据时,可以根据新存入的数据的存入时间获取新存入数据的分表规则;当读取老数据时,可以根据老数据的存入时间获取老数据的分表规则,即实现了新/老数据通过各自对应的分表规则进行读取,由于数据格式可能存在不同,因此新/老数据各自对应的分表规则可以互不相同。而不需要采用现有技术中:为了使得新/老数据统一分表规则,在每一次刷新后关系型数据库需根据最新的分表规则重新执行维护流程的方案,从而实现了对于新/老数据格式以及不同种类数据格式、分表策略的兼容。提高了关系型数据库中,数据库表的并发处理能力以及表容量,也降低数据维护的成本。
本发明实施例还提供一种处理数据表的装置,如图7所示,包括:
分库分表模块,用于将待存储的数据导入数据库实例,并根据当前时间段对应的分表规则,在所述数据库实例中拆分出至少两张分表。
主键管理模块,用于生成所得分表的主键ID,并导入分表索引表,所述主键ID中包括:用于表示数据被存储时的时间维度的信息。
访问管理模块,用于当接收到查询请求时,查询主键ID并确定分表对应的时间段,并根据所确定的时间段的分表规则访问数据。
其中:所述分库分表模块,具体用于将待存储的数据按照预设比例拆分并导入至少两个数据库实例,其中,一个数据库实例对应一个用户单号。
所述主键管理模块,用于根据数据被存储时的时间段得到时间字段。并生成包括了所述时间字段、分库索引字段和识别字段的主键ID,所述分库索引字段包括:会员ID或订单号,所述识别字段包括分表创建时的唯一性标识。
所述访问管理模块,用于根据所述主键ID查询所述分表索引表得到分表名,并根据所述分表名确定所述分表所在分库的分库序号。并根据所述主键ID确定所述分表对应的时间段,并从分表配置表中查询所述分表对应的时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则。再依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述分表所在分库的数据。
所述访问管理模块,还用于获取所述时间段内对应的各分表的主键ID,并查询所述分表索引表得到所述时间段内对应的各分表的分表名,并根据所述各分表的分表名确定各分表所在分库的分库序号。并从分表配置表中查询所述时间段的分表规则,所述分表配置表用于记录各分表的分表名和分表规则。再遍历分表名数组和分库数组,并依据查询得到的分表规则设置分库会话,执行所述分库会话,并访问所述时间段内对应的各分表所在分库中的数据。
进一步的,所述分库分表模块,还用于将已存储的数据迁移至所述数据库实例。并利用所述已存储的数据被存储时的时间段和对应的分表规则,更新所述已存储的数据的分表的主键ID,并在更新后导入分表索引表。
本发明实施例提供的处理数据表的装置,当读取新存入的数据时,可以根据新存入的数据的存入时间获取新存入数据的分表规则。当读取老数据时,可以根据老数据的存入时间获取老数据的分表规则,即实现了不同的数据通过各自对应的分表规则进行读取,由于数据格式可能存在不同,因此不同的数据各自对应的分表规则可以互不相同。而不需要采用现有技术中:为了使得不同的数据统一分表规则,在每一次刷新后关系型数据库需根据最新的分表规则重新执行维护流程的方案,从而实现了对于不同的数据格式以及不同种类数据格式、分表策略的兼容。提高了关系型数据库中,数据库表的并发处理能力以及表容量,也降低数据维护的成本。
本说明书中的各实施例均采用递进的方式描述,各实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于设备实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。