掌桥专利:专业的专利平台
掌桥专利
首页

数据库的优化方法、装置、计算机设备及存储介质

文献发布时间:2024-04-18 19:59:31


数据库的优化方法、装置、计算机设备及存储介质

技术领域

本发明实施例涉及数据库技术领域,尤其涉及一种数据库的优化方法、装置、计算机设备及存储介质。

背景技术

在分布式数据库日益发展的当下,市场对分布式数据库的需求逐步增加,但验证分布式数据库正确性的手段比较匮乏。在部署分布式数据库的同时,用户倾向于回流多分片的数据变动,在单机数据库上进行验证最终的数据一致性。现有回流有两种办法实现:一种是将各个分片的逻辑日志导入到一个单机数据库中;另一种测试用数据变动捕获节点(CDC,Change Data Capture)功能来实现分布式数据库的回流。前者毫无疑问,最简单,但问题也很多。不仅仅多个分片,一个个往单机数据库里导入并回放很花时间,而且还无法解决多分片事务一致的问题,即一个事务无法保证在多分片是同时执行完的,无法按照事务ACID的概念来保障单机事务的正确性,更何况还有多分片复制表、DDL等问题无法解决。后者则是利用分布式数据库的CDC功能来生成一份单机数据库可消费的逻辑日志,这种不仅可以解决多分片复制表、DDL等问题,事务也是完全按照原子性来的,甚至已提交事务回滚也完全兼容。

现有的通过CDC功能可能出现回滚失败的场景,进而导致队列里面事务数量越来越多,会发现每次获取找一个事务需要花费很长时间。且每处理一个事务都会把这个事务写到逻辑日志里面进行落盘,在N分片环境下,除了合并出来的那个事务外,还有N-1个空事务,也就是说需要落盘N次,也就是说每个事务需要N次磁盘IO,落盘次数以及与磁盘IO交互次数过高,开销太大。因此,如何优化数据库CDC的结构和性能成为现在亟待解决的问题。

发明内容

鉴于此,为解决上述技术问题或部分技术问题,本发明实施例提供一种数据库的优化方法、装置、计算机设备及存储介质。

第一方面,本发明实施例提供一种数据库的优化方法,包括:

当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;

当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;

将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

在一个可能的实施方式中,所述第一事务通过以下方式存储至所述目标队列:

将第一线程中用于存放事务的容器确定为一个类,所述第一线程用于消费逻辑日志中的事务;

通过所述第一线程将全局提交序为零的第一事务存储至所述类中的目标队列的队尾;

所述第二事务通过以下方式存储至所述目标堆中:

通过所述第一线程将全局提交序为非零的第二事务存储至所述目标堆中。

在一个可能的实施方式中,所述对所述第一事务进行合并处理,包括:

通过第二线程从所述目标队列获取全局提交序最小的第一事务,以通过所述第二线程对所述第一事务进行合并处理后,将所述目标队列中的第一事务删除。

在一个可能的实施方式中,所述从每个所述分片的目标堆中获取第二事务进行合并处理,包括:

当检测到每个所述目标队列中不存在第一事务时,从每个所述分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过所述第二线程对所述第二事务进行合并处理后,将所述目标堆中的第二事务删除。

在一个可能的实施方式中,所述通过所述第二线程对所述第二事务进行合并处理,包括:

通过所述第二线程将全局提交序相同的第二事务合并为一个目标事务;

将所述数据库中分片号最小的目标分片对应的事务的事务序作为合并后的事务对应的事务序,将所述数据库中其他分片上的事务的事务序用空事务代替。

在一个可能的实施方式中,所述将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作,包括:

针对所述数据库的数据变动捕获节点对应的系统表增加三个列,分别用于记录落盘信息、逻辑日志文件以及所述逻辑日志待写入的位置;

当在所述数据变动捕获节点插入所述系统表时,确定所述落盘信息为零;

当逻辑日志触发落盘操作时,根据所述逻辑日志文件和所述逻辑日志待写入的位置进行落盘操作,以及将所述落盘信息更新为一。

在一个可能的实施方式中,所述方法还包括:

当所述逻辑日志触发落盘操作时,对从每个所述分片上收到的逻辑日志的位点进行更新;

当所述数据库服务端重启时,在所述系统表中检索落盘信息为零的逻辑日志;

删除所述落盘信息为零的逻辑日志在所述系统表中的行记录。

第二方面,本发明实施例提供一种数据库的优化装置,包括:

队列处理模块,用于当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;

堆处理模块,用于当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;

落盘操作模块,用于将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

第三方面,本发明实施例提供一种计算机设备,包括:处理器和存储器,所述处理器用于执行所述存储器中存储的数据库的优化程序,以实现上述第一方面中任一项所述的数据库的优化方法。

第四方面,本发明实施例提供一种存储介质,所述存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现上述第一方面中任一项所述的数据库的优化方法。

本发明实施例提供的数据库的优化方案,通过当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。由此,可以实现提高事务合并的速度,合并性能方面取得了显著的提升,减少了落盘次数以及磁盘IO交互次数,通过优化落盘次数的方式提升CDC性能。

附图说明

图1为本发明实施例提供的一种数据库的优化方法的流程示意图;

图2为本发明实施例提供的另一种数据库的优化方法的流程示意图;

图3为本发明实施例提供的一种数据库的优化装置的结构示意图;

图4为本发明实施例提供的一种计算机设备的结构示意图;

图5为本发明实施例提供的一种优化后数据库性能提升示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为便于对本发明实施例的理解,下面将结合附图以具体实施例做进一步的解释说明,实施例并不构成对本发明实施例的限定。

图1为本发明实施例提供的一种数据库的优化方法的流程示意图,如图1所示,该方法具体包括:

S11、当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零。

本发明实施例提供的数据库的优化方法,应用于计算机设备,该计算机设备可以包括但不限于服务器、台式计算机等,数据库可以是分布式数据库,数据库中包括CDC节点,CDC是用来捕获分布式数据库中各个分片的数据变动的节点,通过获取各个分片的逻辑日志,并消费后输出完整的逻辑日志,以提供下游单机数据库进行消费。CDC通过利用多元复制,每个分片对应一个IO线程,用于拉取逻辑日志,和一个Fetch线程,用于消费逻辑日志里面的每个事务,将事务解析后放在一个队列里,并用一个Compose线程来合并所有Fetch线程队列里面的事务并产生一份单机数据库可以消费的逻辑日志。具体通过获取目标队列中的全局提交序为零的第一事务进行合并处理,再从目标堆中获取全局提交序为非零的第二事务进行合并处理由此提高CDC消费事务时的合并速度,通过对事务进行批量落盘操作,提高落盘效率,优化数据库CDC处理事务的性能。

在本实施例中,CDC使用了全局提交序、全局事务序、事务提交时还在活跃的最小的事务号、事务涉及的分片号的位图等概念。CDC在消费事务时,通常情况下会通过读取每个Fetch线程队列里的事务,通过比较全局提交序的方式,选取全局提交序最小的事务为基准,将全局提交序相同的事务(说明是一个分布式事务)合并为一个事务,通过本发明实施例提供的数据库的优化方法可以提高事务的合并效率。

具体的,预先将每个分片中全局提交序为零的事务确定为第一事务,将每个Fetch线程里面的存放事务的容器改成一个类,该类中有一个专门存全局提交序为零的所有事务的目标队列,一个存全局提交序为非零的所有事务的最小堆,作为目标堆。其中目标队列可以是deque队列,当我们想要去取最小的全局提交序的事务时,先检测目标队列中是否存在事务,当检测到目标队列中存在第一事务时,优先对第一事务进行合并处理。

S12、当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零。

在本实施例中,目标堆中存放有全局提交序为非零的第二事务,当所有全局提交序为零的第一事务都处理完成,再从目标堆里获取全局提交序为非零的第二事务,并进行合并处理,可以实现按顺序优先处理所有全局提交序为零的事务,在处理非零事务。

S13、将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

在本实施例中,设置每预设数量个(例如,1000个)事务落盘一次,从分片收到的逻辑日志的位点更新改成每次sync的时候才更新。系统表新增三个列,每次插入的时候sync列设置为0表征逻辑日志还未落盘,逻辑日志真正sync的时候更新sync列为1,表征逻辑日志已经落盘。每次数据库服务端重启的时候检索系统表,删除逻辑日志还未落盘的行记录。

本发明实施例提供的数据库的优化方法,通过当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。由此,可以实现提高事务合并的速度,合并性能方面取得了显著的提升,减少了落盘次数以及磁盘IO交互次数,通过优化落盘次数的方式提升CDC性能。

图2为本发明实施例提供的另一种数据库的优化方法的流程示意图,如图2所示,该方法具体包括:

S21、将第一线程中用于存放事务的容器确定为一个类;通过所述第一线程将全局提交序为零的第一事务存储至所述类中的目标队列的队尾;通过所述第一线程将全局提交序为非零的第二事务存储至所述目标堆中。

在本实施例中,第一线程为Fetch线程,用于消费逻辑日志里面的每个事务,将事务解析后放在一个队列里。预先将每个Fetch线程里面的存放事务的容器改成一个类,该类中有一个专门存全局提交序为零的所有第一事务的deque队列作为目标队列,Fetch线程每次存放事务的时候,如果是全局提交序为0的就放队列尾放。预先构建一个存全局提交序为非零的所有第二事务的最小堆作为目标堆,如果是全局提交序为非零,就插入到目标堆里面。

S22、当检测到所述数据库中每个分片的目标队列中存在第一事务时,通过第二线程从所述目标队列获取全局提交序最小的第一事务,以通过所述第二线程对所述第一事务进行合并处理后,将所述目标队列中的第一事务删除。

在本实施例中,第二线程为Compose线程,Compose线程获取全局提交序最小的事务的时候,直接从每个Fetch线程的目标队列或者目标堆里面读取。当检测到数据库中任一分片的目标队列中存在第一事务时,则直接从目标队列里面获取全局提交序最小的第一事务并进行处理,否则从目标堆里面获取全局提交序最小的第二事务并进行处理。Compose线程消费完事务后,需要将事务从目标队列或者目标堆中移除。

S23、当检测到每个所述目标队列中不存在第一事务时,从每个所述分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过所述第二线程对所述第二事务进行合并处理后,将所述目标堆中的第二事务删除。

在本实施例中,当检测到每个目标队列中不存在第一事务时,也即目标队列中第二事务全部消费完成,此时,从每个分片的目标堆的堆顶获取全局提交序最小的第二事务,通过第二线程将全局提交序相同的第二事务合并为一个目标事务;将数据库中分片号最小的目标分片对应的事务的事务序作为合并后的事务对应的事务序,将数据库中其他分片上的事务的事务序用空事务代替。(例如,一个分布式事务涉及三个分片,那么合并后的事务使用第一个分片的事务序来作为合并后事务的事务序,这个事务序所对应的事务写入了所有分片事务的内容;剩下两个分片的事务序均写入一个空事务)。

相对于现有技术中,在CDC合并事务时,需要比较每个Fetch线程的队列里面的每个事务,假设有N个分片,即有N个Fetch线程,每个Fetch线程队列里面有M个事务。在忽略网络延时及磁盘IO的情况,平均每次获取全局提交序最小的事务需要O(NM)的时间,找到全局提交序最小的时候后,需要根据事务涉及的分片号的位图来进行确定分布式事务是否完整,即是否在每个分片上的事务都已经被Fetch线程读到了,如果没有读到,还要依据全局事务序是否小于当前活跃的最小的全局事务序来判断该事务是因为网络等时间还没传过来,还是在这个分片上根本就执行失败了。由于很有可能出现回滚失败的场景,在这种场景下当前活跃的最小的全局事务序是不会上涨的,因为回滚失败说明该事务还没结束,全局事务序肯定不能释放,就有可能可能导致全局事务序小于当前活跃的最小的全局事务序的情况一直出现,进而导致队列里面事务数量越来越多。由于每次获取全局提交序最小的事务需要O(NM),当M很大时,会发现每次获取找一个事务就要花费很长时间。

具体的,为了解决现有技术中每次获取全局提交序最小的时候需要花费O(NM)的问题,本发明基于最小堆的数据结构来优化查询时间。由于每个Fetch线程的目标队列中只需要获取全局提交序最小的那个事务,我们可以在Fetch线程中维护一个最小堆的数据结构,每个事务插入的时候更新最小堆,读取的时候拿最小堆的堆顶,移除的时候更新最小堆。

假设有N个分片,每个分片队列里面有M个事务,且每个事务都是全分片的,即总共有M个分布式事务。

那么在使用容器的情况下每个事务插入需要O(1)的时间,M个事务需要O(M)的时间,由于N个分片是并发的,所以总共插入需要花费O(M)的时间。那么当Compose线程处理这N个分片的所有事务的时候,总共需要找M次,每次的查找的时间复杂度都是O(NM)。实际上花费的时间是(NM+N*(M-1)+N*(M-2)+...N*1)=N*(1+M)*M/2,从时间复杂度的角度来说是O(NM2)。那么每次找到事务之后,需要遍历所有分片检查是否完整并删除,也是O(N)*M的代价,也就是O(NM)。所以从插入M个事务到消费完所有的事务需要花费的总代价的时间复杂度是O(NM2)。

而在使用最小堆的时候,M个事务的插入所花的时间分别为

很明显使用最小堆的时候性能提升为

与分片数量不相关,与队列里面的事务数强相关。当队列里面有32(队列默认值)个事务的时候,提升为32/5=6倍;当队列里面有65536个事务的时候,提升为4096倍。换句话说,在低压情况下,队列里面一般默认一次读32个事务的时候,有6倍的性能提升,当高压情况下,当队伍里面有6w多个事务的时候,有4000多倍的提升。

进一步的,由于CDC的堆实现需要有两个条件。首先堆是无法保证排序稳定性的,但分布式可以保证每个事务的大于零的全局提交序都不一样,即不可能有两个落在单分片上的事务有相同的全局提交序,所以不需要考虑堆的稳定性的问题。其次,会有一些全局提交序为零的SQL,比如心跳表的更新等等,这些SQL通常来说只是一些分布式数据库内部日常维护用的SQL,并不是真正的业务下发的事务,并不需要合并。这些事务虽然全局提交序为零,但由于这些事务也需要保证互相之间的顺序,所以也要按顺序处理这些全局提交序为零的事务,所有这些事务不能存在堆里面。

处理的方式为在堆类里面定义一个deque队列,用来存所有全局提交序为零的事务,其他全局提交序不为零的事务,可以存在堆里面。当我们想要去取最小的全局提交序的事务时,当我们发现deque里面还有事务的时候,那么这些事务一定是可以优先处理的,而且这些事务都需要合并,处理起来非常简单,可以用先入先出的队列来处理这些事务。直到所有全局提交序为零的事务都处理完了,再来从堆里面处理全局提交序不为零的事务,不仅仅解决这些事务不能存在堆里面的问题,还解决了要按顺序处理所有全局提交序为零的事务的要求,由此可以提升成事务处理速度。

S24、针对所述数据库的数据变动捕获节点对应的系统表增加三个列;当在所述数据变动捕获节点插入所述系统表时,确定所述落盘信息为零;当逻辑日志触发落盘操作时,根据所述逻辑日志文件和所述逻辑日志待写入的位置进行落盘操作,以及将所述落盘信息更新为一。

在本实施例中,针对落盘次数过多,磁盘IO交互过于频繁的问题,本文通过优化落盘次数的方式提升CDC性能。现有技术中为了保证一致性的考虑,每处理一个事务都会把这个事务写到逻辑日志里面。写到一个逻辑日志里面在Linux环境下需要先Flush()然后Sync()。Flush是将一段内存拷贝到文件系统中,Sync是指Linux操作系统将文件强制落盘操作生成物理文件。在N分片环境下,除了合并出来的那个事务外,还有N-1个空事务,也就是说需要落盘N次,每个事务需要N次磁盘IO。假设有K个事务,那么就需要NK次磁盘IO,这个开销过大。

相对于现有技术中的CDC每次合并一个N分片的事务需要落盘N次(一个合并事务和N-1个空事务)。然而这N个最终需要落盘的事务因为最终在逻辑日志里面是连续的,本发明可以放在一段内存里面,一起落盘,这样N分片的事务只需要落盘1次。还可以继续优化。设置每1000个事务落盘1次,可以进一步的减少落盘次数。为了避免事务原子性的问题,如果服务器直接宕机了,很可能改产生的逻辑日志并没有落盘,然而部分从分片上收到的逻辑日志因为已经消费过了而被清理了,导致重启的时候丢事务了。所以只有再触发sync之后,再允许更新从分片上收到的逻辑日志的位点。也即,当逻辑日志触发落盘操作时,对从每个分片上收到的逻辑日志的位点进行更新。

同样,处理很多事务的时候,需要更新很多系统表信息,比如新建一张复制表,需要把复制表信息插入到系统表里面,那么逻辑日志还没sync就已经宕机了,再起来的时候会发现系统表里面已经有这张表的信息了,然而这是违反事务的ACID特性的。所以本发明对CDC涉及的系统表新增了三个列,分别记录分别用于记录落盘信息,用于表征是否已经sync,也即是否进行落盘操作、当更新系统表的时候要写入的逻辑日志文件,以及逻辑日志要写入的位置。当已经落盘时记录sync值为1,当未落盘时记录sync值为0。在每次插入系统表的时候sync值为0,当逻辑日志触发sync的时候同步把所有系统表sync=0的改成1。

当数据库服务端重启时,在系统表中检索落盘信息为零的逻辑日志;删除落盘信息为零的逻辑日志在系统表中的行记录。具体的,当服务器宕机恢复的时候,扫描系统表,找所有sync=0的行记录,如果当时要写入的逻辑日志位置比现有的逻辑日志位置还大,也就是说,其实没有真正的写入,那么就把系统表这行删除。这样就实现了每1000个事务刷盘一次,也不会丢失事务的方式。原本1000个事务,要磁盘IO交互1000N次,现在只需要交互1次(不算系统表的交互),数据库CDC的性能大大提升。

如图5所示为本发明实施例提供的一种优化后数据库性能提升示意图,通过设置目标堆从堆顶获取事务进行合并处理,且设置成每1000个事务提交一次后的性能提升,可以看到半分钟合并6.7G,即1分钟可以合并13G左右,

本发明实施例提供的数据库的优化方法,通过将第一线程中用于存放事务的容器确定为一个类;通过第一线程将全局提交序为零的第一事务存储至类中的目标队列的队尾;通过第一线程将全局提交序为非零的第二事务存储至目标堆中;当检测到数据库中每个分片的目标队列中存在第一事务时,通过第二线程从目标队列获取全局提交序最小的第一事务,以通过第二线程对第一事务进行合并处理后,将目标队列中的第一事务删除;当检测到每个目标队列中不存在第一事务时,从每个分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过第二线程对第二事务进行合并处理后,将目标堆中的第二事务删除;针对数据库的数据变动捕获节点对应的系统表增加三个列;当在数据变动捕获节点插入所述系统表时,确定落盘信息为零;当逻辑日志触发落盘操作时,根据逻辑日志文件和逻辑日志待写入的位置进行落盘操作,以及将落盘信息更新为一。由此可以实现数据库中通过CDC对事务合并处理的效率,以及落盘速度,以此优化数据库CDC,采用本发明所述方法,与现有CDC技术相比,合并性能方面取得了显著的提升,从原本的5M/s(500个事务/s,一个事务算10K)的合并速度提升到了200M/s(12G/min),性能提高了40倍。

图3为本发明实施例提供的一种数据库的优化装置的结构示意图,如图3所示,该装置具体包括:

队列处理模块31,用于当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;

堆处理模块32,用于当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;

落盘操作模块33,用于将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

在一个可能的实施方式中,确定模块34,用于将第一线程中用于存放事务的容器确定为一个类,所述第一线程用于消费逻辑日志中的事务;

存储模块35,用于通过所述第一线程将全局提交序为零的第一事务存储至所述类中的目标队列的队尾;

所述第二事务通过以下方式存储至所述目标堆中:

通过所述第一线程将全局提交序为非零的第二事务存储至所述目标堆中。

在一个可能的实施方式中,所述队列处理模块,具体用于通过第二线程从所述目标队列获取全局提交序最小的第一事务,以通过所述第二线程对所述第一事务进行合并处理后,将所述目标队列中的第一事务删除。

在一个可能的实施方式中,所述堆处理模块,具体用于当检测到每个所述目标队列中不存在第一事务时,从每个所述分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过所述第二线程对所述第二事务进行合并处理后,将所述目标堆中的第二事务删除。

在一个可能的实施方式中,所述堆处理模块,具体用于通过所述第二线程将全局提交序相同的第二事务合并为一个目标事务;

将所述数据库中分片号最小的目标分片对应的事务的事务序作为合并后的事务对应的事务序,将所述数据库中其他分片上的事务的事务序用空事务代替。

在一个可能的实施方式中,所述落盘操作模块,具体用于针对所述数据库的数据变动捕获节点对应的系统表增加三个列,分别用于记录落盘信息、逻辑日志文件以及所述逻辑日志待写入的位置;

当在所述数据变动捕获节点插入所述系统表时,确定所述落盘信息为零;

当逻辑日志触发落盘操作时,根据所述逻辑日志文件和所述逻辑日志待写入的位置进行落盘操作,以及将所述落盘信息更新为一。

在一个可能的实施方式中,所述落盘操作模块,还用于当所述逻辑日志触发落盘操作时,对从每个所述分片上收到的逻辑日志的位点进行更新;

当所述数据库服务端重启时,在所述系统表中检索落盘信息为零的逻辑日志;

删除所述落盘信息为零的逻辑日志在所述系统表中的行记录。

本实施例提供的数据库的优化装置可以是如图3中所示的装置,可执行如图1-2中数据库的优化方法的所有步骤,进而实现图1-2所示数据库的优化方法的技术效果,具体请参照图1-2相关描述,为简洁描述,在此不作赘述。

图4为本发明实施例提供的一种计算机设备的结构示意图,图4所示的计算机设备400包括:至少一个处理器401、存储器402、至少一个网络接口404和其他用户接口403。计算机设备400中的各个组件通过总线系统405耦合在一起。可理解,总线系统405用于实现这些组件之间的连接通信。总线系统405除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图4中将各种总线都标为总线系统405。

其中,用户接口403可以包括显示器、键盘或者点击设备(例如,鼠标,轨迹球(trackball)、触感板或者触摸屏等。

可以理解,本发明实施例中的存储器402可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(Read-Only Memory,ROM)、可编程只读存储器(Programmable ROM,PROM)、可擦除可编程只读存储器(Erasable PROM,EPROM)、电可擦除可编程只读存储器(Electrically EPROM,EEPROM)或闪存。易失性存储器可以是随机存取存储器(Random Access Memory,RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(Static RAM,SRAM)、动态随机存取存储器(Dynamic RAM,DRAM)、同步动态随机存取存储器(Synchronous DRAM,SDRAM)、双倍数据速率同步动态随机存取存储器(Double Data RateSDRAM,DDRSDRAM)、增强型同步动态随机存取存储器(Enhanced SDRAM,ESDRAM)、同步连接动态随机存取存储器(Synch link DRAM,SLDRAM)和直接内存总线随机存取存储器(DirectRambus RAM,DRRAM)。本文描述的存储器402旨在包括但不限于这些和任意其它适合类型的存储器。

在一些实施方式中,存储器402存储了如下的元素,可执行单元或者数据结构,或者他们的子集,或者他们的扩展集:操作系统4021和应用程序4022。

其中,操作系统4021,包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序4022,包含各种应用程序,例如媒体播放器(Media Player)、浏览器(Browser)等,用于实现各种应用业务。实现本发明实施例方法的程序可以包含在应用程序4022中。

在本发明实施例中,通过调用存储器402存储的程序或指令,具体的,可以是应用程序4022中存储的程序或指令,处理器401用于执行各方法实施例所提供的方法步骤,例如包括:

当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;

当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;

将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

在一个可能的实施方式中,将第一线程中用于存放事务的容器确定为一个类,所述第一线程用于消费逻辑日志中的事务;

通过所述第一线程将全局提交序为零的第一事务存储至所述类中的目标队列的队尾;

所述第二事务通过以下方式存储至所述目标堆中:

通过所述第一线程将全局提交序为非零的第二事务存储至所述目标堆中。

在一个可能的实施方式中,通过第二线程从所述目标队列获取全局提交序最小的第一事务,以通过所述第二线程对所述第一事务进行合并处理后,将所述目标队列中的第一事务删除。

在一个可能的实施方式中,当检测到每个所述目标队列中不存在第一事务时,从每个所述分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过所述第二线程对所述第二事务进行合并处理后,将所述目标堆中的第二事务删除。

在一个可能的实施方式中,通过所述第二线程将全局提交序相同的第二事务合并为一个目标事务;

将所述数据库中分片号最小的目标分片对应的事务的事务序作为合并后的事务对应的事务序,将所述数据库中其他分片上的事务的事务序用空事务代替。

在一个可能的实施方式中,针对所述数据库的数据变动捕获节点对应的系统表增加三个列,分别用于记录落盘信息、逻辑日志文件以及所述逻辑日志待写入的位置;

当在所述数据变动捕获节点插入所述系统表时,确定所述落盘信息为零;

当逻辑日志触发落盘操作时,根据所述逻辑日志文件和所述逻辑日志待写入的位置进行落盘操作,以及将所述落盘信息更新为一。

在一个可能的实施方式中,当所述逻辑日志触发落盘操作时,对从每个所述分片上收到的逻辑日志的位点进行更新;

当所述数据库服务端重启时,在所述系统表中检索落盘信息为零的逻辑日志;

删除所述落盘信息为零的逻辑日志在所述系统表中的行记录。

上述本发明实施例揭示的方法可以应用于处理器401中,或者由处理器401实现。处理器401可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器401中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器401可以是通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(FieldProgrammable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件单元组合执行完成。软件单元可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器402,处理器401读取存储器402中的信息,结合其硬件完成上述方法的步骤。

可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(ApplicationSpecific Integrated Circuits,ASIC)、数字信号处理器(Digital Signal Processing,DSP)、数字信号处理设备(DSPDevice,DSPD)、可编程逻辑设备(Programmable LogicDevice,PLD)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)、通用处理器、控制器、微控制器、微处理器、用于执行本申请所述功能的其它电子单元或其组合中。

对于软件实现,可通过执行本文所述功能的单元来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。

本实施例提供的计算机设备可以是如图4中所示的计算机设备,可执行如图1-2中数据库的优化方法的所有步骤,进而实现图1-2所示数据库的优化方法的技术效果,具体请参照图1-2相关描述,为简洁描述,在此不作赘述。

本发明实施例还提供了一种存储介质(计算机可读存储介质)。这里的存储介质存储有一个或者多个程序。其中,存储介质可以包括易失性存储器,例如随机存取存储器;存储器也可以包括非易失性存储器,例如只读存储器、快闪存储器、硬盘或固态硬盘;存储器还可以包括上述种类的存储器的组合。

当存储介质中一个或者多个程序可被一个或者多个处理器执行,以实现上述在设备侧执行的数据库的优化方法。

所述处理器用于执行存储器中存储的程序,以实现以下在设备侧执行的数据库的优化方法的步骤:

当检测到所述数据库中每个分片的目标队列中存在第一事务时,对所述第一事务进行合并处理,所述第一事务的全局提交序为零;

当全部所述第一事务处理完成后,从每个所述分片的目标堆中获取第二事务进行合并处理,所述第二事务的全局提交序为非零;

将预设数量个进行合并处理后的事务存储至目标位置,并进行落盘操作。

在一个可能的实施方式中,将第一线程中用于存放事务的容器确定为一个类,所述第一线程用于消费逻辑日志中的事务;

通过所述第一线程将全局提交序为零的第一事务存储至所述类中的目标队列的队尾;

所述第二事务通过以下方式存储至所述目标堆中:

通过所述第一线程将全局提交序为非零的第二事务存储至所述目标堆中。

在一个可能的实施方式中,通过第二线程从所述目标队列获取全局提交序最小的第一事务,以通过所述第二线程对所述第一事务进行合并处理后,将所述目标队列中的第一事务删除。

在一个可能的实施方式中,当检测到每个所述目标队列中不存在第一事务时,从每个所述分片的目标堆的堆顶获取全局提交序最小的第二事务,以通过所述第二线程对所述第二事务进行合并处理后,将所述目标堆中的第二事务删除。

在一个可能的实施方式中,通过所述第二线程将全局提交序相同的第二事务合并为一个目标事务;

将所述数据库中分片号最小的目标分片对应的事务的事务序作为合并后的事务对应的事务序,将所述数据库中其他分片上的事务的事务序用空事务代替。

在一个可能的实施方式中,针对所述数据库的数据变动捕获节点对应的系统表增加三个列,分别用于记录落盘信息、逻辑日志文件以及所述逻辑日志待写入的位置;

当在所述数据变动捕获节点插入所述系统表时,确定所述落盘信息为零;

当逻辑日志触发落盘操作时,根据所述逻辑日志文件和所述逻辑日志待写入的位置进行落盘操作,以及将所述落盘信息更新为一。

在一个可能的实施方式中,当所述逻辑日志触发落盘操作时,对从每个所述分片上收到的逻辑日志的位点进行更新;

当所述数据库服务端重启时,在所述系统表中检索落盘信息为零的逻辑日志;

删除所述落盘信息为零的逻辑日志在所述系统表中的行记录。

专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120116524394