一种存储引擎中数据索引的方法以及相关装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种存储引擎中数据索引的方法以及相关装置。
背景技术
随着云技术的发展,越来越多的应用出现在人们生活中,而在云技术中,需要数据库的参与,以实现数据交互。数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
一般,可以采用MySQL这一支持多种存储引擎的数据库管理系统以适用于不同的应用场景中。其中,不同存储引擎对事务的支持能力可以不同。例如InnoDB存储引擎实现了完整的事务支持,也支持分布式事务的XA协议;而MyISAM存储引擎便于拓展;另外NEWDB引擎则支持单语句的事务;从而实现多种场景的数据索引过程。
但是,在MySQL的插件式体系架构中,每个存储引擎的代码都是独立的,每开发一个新的存储引擎,都需要单独开发完整的一套数据存储和事务机制;然而这个开发过程复杂度高,且容易造成代码的冗余,影响数据库的索引效率。
发明内容
有鉴于此,本申请提供一种数据索引的方法,可以有效减少存储引擎应用过程的复杂度以及代码的冗余,提高数据索引过程的效率。
本申请第一方面提供一种数据索引的方法,可以应用于终端设备中包含数据索引功能的系统或程序中,具体包括:获取目标事务,所述目标事务用于指示数据索引过程;
根据所述目标事务确定第一存储引擎中的目标数据,所述目标数据包含于至少一个第一索引表中;
根据所述第一索引表确定在第二存储引擎中配置的至少一个第二索引表,所述第二索引表为基于所述第一索引表增加行标识所得,所述行标识用于指示所述目标数据中的行数据,所述行数据与所述目标数据中的索引列相对应,所述索引列基于所述目标事务所得,所述第二存储引擎支持所述目标事务的执行;
从所述第二索引表中确定与所述第一存储引擎中的数据索引条件对应的索引数据,所述索引数据包含于所述目标数据。
本申请第二方面提供一种数据索引的装置,包括:获取单元,用于获取目标事务,所述目标事务用于指示数据索引过程;
确定单元,用于根据所述目标事务确定第一存储引擎中的目标数据,所述目标数据包含于至少一个第一索引表中;
映射单元,用于根据所述第一索引表确定在第二存储引擎中配置的至少一个第二索引表,所述第二索引表为基于所述第一索引表增加行标识所得,所述行标识用于指示所述目标数据中的行数据,所述行数据与所述目标数据中的索引列相对应,所述索引列基于所述目标事务所得,所述第二存储引擎支持所述目标事务的执行;
索引单元,用于从所述第二索引表中确定与所述第一存储引擎中的数据索引条件对应的索引数据,所述索引数据包含于所述目标数据。
本申请第三方面提供一种计算机设备,包括:存储器、处理器以及总线系统;所述存储器用于存储程序代码;所述处理器用于根据所述程序代码中的指令执行上述第一方面所述的数据索引的方法。
本申请第四方面提供一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面所述的数据索引的方法。
从以上技术方案可以看出,本申请实施例具有以下优点:
通过获取指示数据索引过程目标事务,并根据目标事务确定第一存储引擎中的目标数据,目标数据包含于至少一个第一索引表中;然后根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;进而从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。从而实现了跨存储引擎的数据索引过程,由于减少了新的存储引擎引入的开发复杂度,实现了多存储引擎的代码复用,提高了数据库的索引效率;进一步的通过对于第二存储引擎的功能设计使得第一存储引擎可以执行自身无法搭载的功能,进一步的提高了数据库的应用范围以及索引效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为数据索引系统运行的网络架构图;
图2为本申请实施例提供的一种数据索引的流程架构图;
图3为本申请实施例提供的一种数据索引的方法的流程图;
图4为本申请实施例提供的一种索引表更新流程示意图;
图5为本申请实施例提供的另一种数据索引的方法的流程图;
图6为本申请实施例提供的一种数据插入操作流程示意图;
图7为本申请实施例提供的一种数据恢复的方法的流程图;
图8为本申请实施例提供的一种数据索引装置的结构示意图;
图9为本申请实施例提供的另一种数据索引装置的结构示意图。
具体实施方式
本申请实施例提供了一种数据索引的方法以及相关装置,可以应用于终端设备中包含数据索引功能的系统或程序中,通过获取指示数据索引过程目标事务,并根据目标事务确定第一存储引擎中的目标数据,目标数据包含于至少一个第一索引表中;然后根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;进而从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。从而实现了跨存储引擎的数据索引过程,由于减少了新的存储引擎引入的开发复杂度,实现了多存储引擎的代码复用,提高了数据库的索引效率;进一步的通过对于第二存储引擎的功能设计使得第一存储引擎可以执行自身无法搭载的功能,进一步的提高了数据库的应用范围以及索引效率。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“对应于”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
首先,对本申请实施例中可能出现的一些名词进行解释。
MySQL:一个关系型数据库管理系统,它采用插件式体系结构,可同时支持多个存储引擎。
存储引擎:负责数据库管理系统中数据存储和事务管理等功能,是数据库系统的核心模块。MySQL可以同时支持多个不同的存储引擎,以提供针对不同场景优化的数据存储和事务管理能力;常见的存储引擎有InnoDB、MyISAM等。
事务(transaction):是访问并可能操作各种数据项的一个数据库操作序列。事务由事务开始与事务结束之间执行的全部数据库操作组成。事务具有ACID特性,即原子性(Atomicity);一致性(Consistency);隔离性(Isolation);持久性(Durability)。
数据库模式定义语言(Data Definition Language,DDL):即数据可以模式信息,是用于描述数据库中要存储的库表结构的语言。比如CREATE、ALTER、DROP等。
数据操纵语言(Data Manipulation Language,DML):即数据操纵信息,用户通过它可以实现对数据库的基本操作。比如INSERT、DELETE、UPDATE等。
XA机制:数据库连接事务中的XA是指由X/Open组织提出的分布式事务处理的规范。
行标识(rowno):一种函数标识,可以返回表格中当前列段数据的当前行数,即行数据的集合标识。
行数据:索引表表中同一键值对应的索引值集合。
索引表:一种指示逻辑记录和物理记录之间对应关系的表,可以用于标识数据库中的数据。
应理解,本申请提供的数据索引方法可以应用于包含数据库或需要进行数据读写的系统或程序中,例如MySQL数据库或者基于MySQL运行的相关程序等,具体的,数据索引系统可以运行于如图1所示的系统架构中,如图1所示,是数据索引系统运行的系统架构图,下面以MySQL进行说明,MySQL包括接入层、服务层、存储引擎层和系统文件层;其中,接入层主要负责连接处理、授权认证、安全等事宜;而服务层主要负责查询解析、分析、优化、缓存及所有内置函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图、binlog、表锁等;存储引擎层主要负责MySQL中数据的存储和提取,服务层通过API与存储引擎通信,存储引擎包含几十个底层函数API,每种引擎提供一套具体实现;系统文件层主要负责底层文件系统的读写。本申请中提供的数据索引方法可以应用于存储引擎层中插件式设置的多个存储引擎的交互过程中,通过将第一存储引擎的事务通过第二存储引擎复用,实现底层函数的统一应用。可以理解的是,图中示出了包含了1个第一存储引擎和1个第二存储引擎,但在实际场景中,还可以是更多的第一存储引擎或更多的第二存储引擎,具体数量因实际场景而定,此处不做限定,具体的,存储引擎的类型可以是InnoDB、MyISAM或NEWDB等。
可以理解的是,上述数据索引系统可以运行于服务器,例如:作为云端数据存储的应用,也可以运行于终端设备,还可以作为运行于第三方设备以提供数据索引,以得到数据索引后的节点分布结果;具体的数据索引系统可以是以一种程序的形式在上述设备中运行,也可以作为上述设备中的系统部件进行运行,还可以作为云端服务程序的一种,具体运作模式因实际场景而定,此处不做限定。
本申请实施例可以是云技术(Cloud technology)的一种应用,云技术是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术。
具体的,云技术基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络系统的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台系统进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的系统后盾支撑,只能通过云计算来实现。
而在云技术中,需要数据库的参与。数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
数据库管理系统(Database Management System,DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
而随着云技术的发展,越来越多的应用出现在人们生活中,而在云技术中,需要数据库的参与,以实现数据交互。
一般,可以采用MySQL这一支持多种存储引擎的数据库管理系统以适用于不同的应用场景中。其中,不同存储引擎对事务的支持能力可以不同。例如InnoDB存储引擎实现了完整的事务支持,也支持分布式事务的XA协议;而MyISAM存储引擎便于拓展;另外NEWDB引擎则支持单语句的事务;从而实现多种场景的数据索引过程。
但是,在MySQL的插件式体系架构中,每个存储引擎的代码都是独立的,每开发一个新的存储引擎,都需要单独开发完整的一套数据存储和事务机制;然而这个开发过程复杂度高,且容易造成代码的冗余,影响数据库的索引效率。
为了解决上述问题,本申请提出了一种数据索引的方法,该方法应用于图2所示的数据索引的流程框架中,如图2所示,为本申请实施例提供的一种数据索引的流程架构图,通过第一存储引擎接入目标事务,并基于目标事务在第二存储引擎中进行索引表的映射,从而实现跨存储引擎的数据索引过程;一般对于第二存储引擎采用具有完整事务功能的存储引擎,例如:InnoDB,从而使得第一存储引擎可以较为简单的进行复用存储引擎层中的底层函数,进行数据索引过程。
可以理解的是,本申请所提供的方法可以为一种程序的写入,以作为硬件系统中的一种处理逻辑,也可以作为一种数据索引装置,采用集成或外接的方式实现上述处理逻辑。作为一种实现方式,该数据索引装置通过获取指示数据索引过程目标事务,并根据目标事务确定第一存储引擎中的目标数据,目标数据包含于至少一个第一索引表中;然后根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;进而从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。从而实现了跨存储引擎的数据索引过程,由于减少了新的存储引擎引入的开发复杂度,实现了多存储引擎的代码复用,提高了数据库的索引效率;进一步的通过对于第二存储引擎的功能设计使得第一存储引擎可以执行自身无法搭载的功能,进一步的提高了数据库的应用范围以及索引效率。
结合上述流程架构,下面将对本申请中数据索引的方法进行介绍,请参阅图3,图3为本申请实施例提供的一种数据索引的方法的流程图,应用于计算机设备中,本申请实施例至少包括以下步骤:
301、计算机设备获取目标事务。
本实施例中,目标事务用于指示数据索引过程;其中,目标事务可以是当前数据库一直在执行的事务;也可以是新下发的事务;而对于第一存储引擎而言,可以不进行底层函数的设计,通过第二存储引擎的底层函数即可实现数据索引功能。
302、计算机设备根据目标事务确定第一存储引擎中的目标数据。
本实施例中,目标数据包含于至少一个第一索引表中;其中,第一索引表记录了不同版本的第一存储引擎中的目标数据;在一种可能的场景中,第一存储引擎为NEWDB,该数据库存储引擎仅支持单一语句的事务,且在新加入该引擎的情况下,需要对于该单一语句的事务设计底层函数,以通过接口进行数据交互。
303、计算机设备根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表。
本实施例中,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;由于每条插入或删除的记录都有独立的行标识(rowno),通过rowno可以直接获取到某一行数据,以进行批量操作。
可以理解的是,由于不同存储引擎功能的对应性,本实施例中以第一存储引擎不支持多语句并发事务,而第二存储引擎支持多语句并发事务进行说明,以指出存储引擎复用过程中的功能特征,即使用完整功能的存储引擎复用单一功能的存储引擎;下面,以第一存储引擎为NEWDB,第二存储引擎为InnoDB作为示例进行说明,此处不做限定。
可选的,由于数据库在使用过程中会涉及数据的交互,其数据可能存在变化的情况,比如DDL和DML语句的实现;此时需要对相关数据进行更新,基于本申请中的数据索引方法可以进行如下操作以实现数据更新。
一、对于DDL语句。
本实施例中,首先确定目标事务中的数据库模式信息,即DDL语句;然后根据DDL语句对第二索引表进行更新。其中,DDL语句包括CREATE、ALTER、DROP等。具体的,如图4所示,是本申请实施例提供的一种索引表更新流程示意图,即首先在第一存储引擎中接入事务,并确定DDL语句,然后确定对应的第一索引表,基于第一索引表查找映射在第二存储引擎中的第二索引表,进而进行索引表的创建过程。
对于CREATE语句,判断是否在创建带索引的NEWDB表,如果是,则额外创建一个对应的索引表。该索引表包含与NEWDB表相同定义的索引列,以及一个额外的列rowno,其数据类型为BIGINT,用来表示NEWDB引擎中记录的行号,即基于索引方式对第二索引表进行分类,以对第二索引表进行更新,索引方式包括主键索引、唯一索引或普通索引。
在一种可能的场景中,假设第二索引表t拥有多个列c1、c2、c3、c4、c5,其中主键索引列为c1、c2,唯一索引列为c3、c4,普通索引列为c5。我们将在InnoDB中创建索引对应的三个索引表:t_pk(c1,c2,owno),t_unique1(c3,c4,rowno),t_index1(c5,rowno)。
具体的,可以通过如下语句执行上述过程:
对于主键索引;
CREATE TABLE_NDB_INDEX.t_pk(c1<Type>//确定主键索引指令;
,c2<Type>//输入索引条件;
,rowno BIGINT//输入行标识;
,PRIMARY KEY(c1,c2))//确定主键索引列;
ENGINE=InnoDB;//指示存储引擎;
对于唯一索引;
CREATE TABLE_NDB_INDEX.t_uniq1(c3<Type>//确定唯一索引指令;
,c4<Type>//输入索引条件;
,rowno BIGINT//输入行标识;
,UNIQUE INDEX(c3,c4))//确定唯一索引列;
ENGINE=InnoDB;//指示存储引擎;
对于普通索引;
CREATE TABLE_NDB_INDEX.t_index1(c5<Type>//确定普通索引指令
,rowno BIGINT//输入行标识;
,INDEX(c5))//确定普通索引列;
ENGINE=InnoDB;//指示存储引擎。
通过上述实现方式即可以实现CREATE语句对于第二索引表的更新过程。
另外,在对NEWDB引擎执行DROP TABLE语句时,如果表中有索引,则删除在_NDB_INDEX数据库中对应的索引表,即获取DDL语句中对于行数据的处理信息;然后基于处理信息提取对应的索引列变化数据;并根据索引列变化数据对第二索引表进行更新。
在执行ALTERE TABLE语句时。如果是ADD COLUMN,则在第二索引表中增加新列,不需要处理已有的索引表。如果是DROP COLUMN,则需要删除第二索引表中对应的列。如果是ADD INDEX、DROP INDEX等,则需要去增加或删除对应的索引表。
可以理解的是,上述语句为示例说明,其他DDL语句的执行也可以参照上述CREATE、ALTER或DROP语句的执行过程进行,此处不做限定。
二、对于DML语句。
本实施例中,DML语句包括INSERT、UPDATE、DELETE;在执行这些语句的时候需要同时维护对应的索引表。具体的,即确定目标事务中的DML语句,DML语句用于指示数据的插入、更新或删除;然后根据DML语句对第二索引表进行更新。
对于INSERT语句,首先对于表上的每个主键索引和唯一索引,在索引表中检查待插入的记录是否已经存在;若记录已经存在,则结束事务,返回INSERT失败;否则,在NEWDB引擎中插入记录,并且返回所有记录的索引列和rowno的对照表;然后根据前一个步骤中返回的对照表,在索引表中批量插入。
对于DELETE语句,首先按照DELETE语句中的WHERE条件在NEWDB引擎中查找满足条件的记录;然后在NEWDB引擎中删除满足条件的记录,并记录其rowno;接下来按照rowno在索引表中依次执行删除操作。
可选的,若DELETE语句的WHERE条件带有索引列,即数据索引条件带有索引列,可以先在索引表中按照WHERE条件中的索引列条件找出匹配的记录的rowno。然后将查询条件中的索引列条件替换为找出的rowno,再进行删除操作。通过数据索引条件确定对应的行标识,进而进行删除操作,减少了数据处理量,提高了流程效率。
对于DELETE语句,首先按照UPDATE语句中的WHERE条件在NEWDB引擎中查找满足条件的记录;然后在NEWDB引擎中删除满足条件的记录,并记录其rowno;接下来在NEWDB引擎中根据UPDATE语句计算出新值并插入记录,记录新记录的rowno;并按照记录的新旧rowno在索引表中依次执行更新操作。
可选的,若UPDATE语句的WHERE条件带有索引列,通过数据索引条件确定对应的行标识,进而进行更新操作;可以减少了数据处理量,提高了流程效率。
可以理解的是,通过提供指定行标识的查询和修改,可以大大提高操作的执行效率;并且在某些业务场景下有更好的效果,比如业务需要分批处理多行数据,指定行号的查询可以保证处理时数据不会有重复或者错漏。
304、计算机设备从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。
本实施例中,索引数据包含于目标数据。其中,对于索引的过程可以基于行标识进行,具体的,首先获取目标事务在第一存储引擎中的数据索引条件,以确定数据索引条件指示的行标识;然后根据数据索引条件指示的行标识确定在第二索引表中对应的行标识,以得到行数据;进而根据行数据确定对应的索引数据。由于行标识对应于多个行数据,直接在NEWDB引擎中查找对应行标识位置的记录并返回结果,不需要读取所有数据顺序进行查找,极大的提高查询速度。
可选的,若数据索引条件指示的是索引值,则可以根据目标索引值确定对应的第二索引表中的多个对应索引表;然后在这些索引表中筛选对应于目标索引值的行数据,以得到对应的索引数据。例如:如果WHERE条件指定了索引值,则先通过索引表进行查询,将符合条件的所有索引表中的记录查询出来,再根据索引表中记录的rowno值快速的查找到实际的记录值。
在一种可能的场景中,可以通过下述语句实现上述数据查询的过程:
SELECT_rowno FROM t;//选择行标识;
SELECT_rowno FROM t WHERE a=12;//确定数据索引条件中的行标识;
SELECT*FROM t WHERE_rowno=12;//查询对应的行标识
DELETE FROM t WHERE_rowno=12;//提取查询结果
通过上述查询加速过程,可以提高从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据的效率。
结合上述实施例可知,通过获取指示数据索引过程目标事务,并根据目标事务确定第一存储引擎中的目标数据,目标数据包含于至少一个第一索引表中;然后根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;进而从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。从而实现了跨存储引擎的数据索引过程,由于减少了新的存储引擎引入的开发复杂度,实现了多存储引擎的代码复用,提高了数据库的索引效率;进一步的通过对于第二存储引擎的功能设计使得第一存储引擎可以执行自身无法搭载的功能,进一步的提高了数据库的应用范围以及索引效率。
上述实施例介绍了数据索引的过程,在一种可能的场景中,还可以对数据更新过程进行检测,以保证数据一致,请参阅图5,图5为本申请实施例提供的另一种数据索引的方法的流程图,本申请实施例至少包括以下步骤:
501、计算机设备获取目标事务。
502、计算机设备根据目标事务确定第一存储引擎中的目标数据。
503、计算机设备根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表。
本实施例中,步骤501-503与图3所述实施例的步骤301-303相似,相关特征描述可以进行参考,此处不做赘述。
504、计算机设备执行目标事务中的数据操纵信息。
本实施例中,可以参考图3所述实施例的步骤303中对于DML语句的执行的相关描述,此处不做赘述。
505、计算机设备在执行过程中设置至少一个故障检测点。
本实施例中,在执行过程中对数据使用多个版本存储,每个索引表都用版本号来表示数据变化;其中,版本号是一个递增的整数,即事务提交的时候为切换版本,否则使用老的版本。具体的,首先根据变化信息确定第一存储引擎对应的版本号,以在第二存储引擎中生成日志表;然后确定变化信息对应的处理流程;并为处理流程设置至少一个故障检测点,故障检测点基于第一存储引擎和第二存储引擎的交互过程确定;进而基于故障检测点确定相邻的第一存储引擎版本号的数据对应情况。
可选的,日志表可以采用如下结构:
CREATE TABLE_newdb.wal(dbid BIGINT//创建日志表
,tableid BIGINT//记录索引表
,version BIGINT//记录版本号
,PRIMARY KEY(dbid,tableid))//记录关联关系
ENGINE=InnoDB;//数据库类型
具体的,对应于具体的DML语句的执行过程中。对于INSERT语句,可以参考如图6所示的过程,图6为本申请实施例提供的一种数据插入操作流程示意图。该过程包括如下步骤:
601、计算机设备开始插入。
602、计算机设备判断是否记录存在。
本实施例中,对于第二索引表上的每个主键索引和唯一索引,在索引表中检查带插入的记录是否已经存在,如果记录已经存在,则结束事务,返回INSERT失败。
603、计算机设备报错结束。
604、计算机设备插入日志表记录。
本实施例中,记录步骤602中第二索引表的版本,然后在索引表_newdb.wal中插入记录(dbid,tableid,version),即存储引擎ID、索引表ID以及版本号。
605、计算机设备提交第二存储引擎事务。
606、计算机设备插入第一存储引擎日志表。
本实施例中,通过日志表对比的方法来判断数据一致性,此时在第一存储引擎进行日志表的插入过程;即插入NEWDB表记录数据,并进行NEWDB的事务提交,提交后的NEWDB表版本切换为版本version+1。
607、计算机设备提交第一存储引擎事务。
608、计算机设备插入索引表记录。
本实施例中,将插入NEWDB表返回的记录索引列和rowno插入到对应的索引表中。
609、计算机设备删除日志表记录。
本实施例中,删除表_newdb.wal中在步骤604中插入的记录。
610、计算机设备提交第二存储引擎事务。
611、计算机设备插入成功并结束进程。
对于上述插入过程,可以设置4个故障点;其中,步骤601-步骤605为故障点1的检测过程;步骤606-步骤607为故障点2的检测过程;步骤608-步骤610为故障点3的检测过程;步骤611为故障点4的检测过程。
具体的,对于故障点1,其可能的故障原因为_newdb.wal表未插入记录,或插入了记录但是没有提交。此时由于_newdb.wal表是使用的完整事务支持的存储引擎,恢复后由于事务原子性的保证,插入但未提交的记录会被回滚掉。故该故障点可以不进行额外的故障恢复过程,就可以保证NEWDB的数据和索引是一致的。
对于故障点2,此时_newdb.wal表已经记录了新数据,但是NEWDB表的事务未提交,数据和索引虽然没有不一致,但是_newdb.wal表的记录可能是不正确的,需要进行恢复。恢复时可以根据dbid和tableid字段查找出_newdb.wal中记录的版本,比如为1,然后判断NEWDB表的当前版本,如果也为1则说明需要回滚_newdb.wal表中的记录。其中,回滚操作可以是直接删除_newdb.wal表中对应的记录即可。
对于故障点3,此时_newdb.wal表已经记录了新数据,NEWDB表的事务也已经提交,但是索引表的数据还没有进行更新,_newdb.wal表的记录也没有删除,数据与索引不一致,需要进行恢复。恢复时根据dbid和tableid字段查找出_newdb.wal表中记录的版本,比如为1,然后判断NEWDB表的当前版本,如果为2,则说明是这种情况,需要重做恢复过程。由于_newdb.wal表和索引表是同一个存储引擎,且该引擎支持完整的事务,所以这两个表在第三步的操作是保持一致的。在NEWDB表中查询对比版本1和2之间发生的记录变化,并将这些变化的记录rowno写入到索引表中,然后删除_newdb.wal表的记录,并提交事务。
对于故障点4,由于所有步骤的事务都已经提交,故数据都处于一致状态,可以不进行数据恢复。
另外,对于DELETE语句,首先在NEWDB中索引表删除操作之前,记录下NEWDB表的版本,对_newdb.wal进行插入记录(dbid,tableid,version),并进行事务提交;然后按照DELETE语句中的WHERE条件在NEWDB引擎中查找满足条件的记录。如果WHERE语句指定了rowno,直接通过rowno查找到需要删除的NEWDB表记录。其中,如果WHERE语句指定了索引列,则通过索引表查找到需要删除的NEWDB表记录rowno,然后通过rowno找到需要删除的NEWDB表记录;如果WHERE语句未指定rowno和索引列,需要顺序查找NEWDB表来找到需要删除的记录。进而删除查找到的NEWDB记录,并进行提交,提交后的NEWDB表版本变化为version+1。然后根据NEWDB表删除的行的rowno,在索引表中将对应记录进行删除,再删除_newdb.wal在第一步插入的记录。并进行事务提交。
对于UPDATE语句,首先NEWDB中索引表更新操作之前,记录下NEWDB表的版本,对_newdb.wal进行插入记录(dbid,tableid,version),并进行事务提交。然后按照UPDATE语句中的WHERE条件在NEWDB引擎中查找满足条件的记录;如果WHERE语句指定了rowno,直接通过rowno查找到需要删除的NEWDB表记录;如果WHERE语句指定了索引,通过索引表查找到需要删除的NEWDB表记录的rowno,然后找到需要删除的NEWDB表记录;如果WHERE语句未指定rowno和索引,需要顺序查找NEWDB表来找到需要删除的记录。接下来根据UPDATE语句计算出新值并插入记录,记录新记录的rowno并进行提交,提交后的NEWDB表版泵变化为version+1。进而根据NEWDB表新老行的rowno,在索引表中将对应记录进行更新,再删除_newdb.wal在第一步插入的记录。并进行事务提交。
可选的,上述故障检测过程中的日志表也可以采用一个记录所有修改过的记录的行号的日志表,然后在恢复阶段根据日志表中的数据来进行REDO或者UNDO操作,即基于行标识为恢复单元进行检测与恢复。
506、计算机设备判断是否故障。
本实施例中,通过步骤505中介绍的对于不同故障点的判断过程,可以得到判断的结果,若判断为故障,则需进行数据恢复,以保证数据的一致性;若判断为正常,则进行步骤507的索引过程。
507、计算机设备从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。
本实施例中,步骤507与图3所述实施例的步骤304相似,相关特征描述可以进行参考,此处不做赘述。
结合上述实施例可见,通过复用具有完整事务功能的存储引擎,来实现新引擎的索引,降低了新引擎索引实现的难度以及出现问题的风险。进一步的通过使用完整事务功能的存储引擎来实现新引擎的索引,可以复用已有的成熟模块,降低开发工作量,使得新引擎不需要重新实现B+树,也不需要实现其上完整的事务支持。
上述实施例介绍了数据索引中故障检测的过程,下面对检测出故障后的数据恢复过程进行介绍,请参阅图7,图7为本申请实施例提供的一种数据恢复的方法的流程图,本申请实施例至少包括以下步骤:
701、计算机设备恢复开始。
702、计算机设备查看日志表。
本实施例中,日志表为第二存储引擎的日志表,其中记录了第二存储引擎中的索引表根据DML语句而执行的相关数据操作记录。
703、计算机设备判断记录是否存在。
本实施例中,若操作记录存在则进行步骤704;若不存在,则进行步骤711。
704、计算机设备获取日志表中的任一记录。
本实施例中,获取日志表中记录的过程可以是随机进行的记录挑选,也可以是基于一定规则顺序的记录挑选,例如:首选获取数据插入的记录。
705、计算机设备获取日志表中的版本。
706、计算机设备获取日志表的实际版本。
本实施例中,日志表的实际版本即为该日志表对应事务执行过后的存储引擎数据状态。
707、计算机设备判断差异。
本实施例中,通过对日志表中的版本对应的数据,以及日志表的实际版本的数据进行对比,以确定数据差异。
708、计算机设备获取版本差异。
709、计算机设备更新索引表。
本实施例中,根据版本差异确定对应的差异数据,并对差异数据在索引表中进行相应的修改,以对索引表进行更新,具体的,可以将索引表更新为日志表的实际版本对应的数据。
710、计算机设备删除日志表对应记录。
711、计算机设备结束恢复。
结合上述实施例可见,通过确定第二存储引擎中日志表中记录的版本号;然后根据变化信息确定第一存储引擎的版本号;并比对日志表中记录的版本号和第一存储引擎的版本号,以生成差异记录;进而根据差异记录更新第一索引表和第二索引表。实现了数据故障的恢复过程,保证了数据的一致性,提高了存储引擎数据处理的准确性。
为了更好的实施本申请实施例的上述方案,下面还提供用于实施上述方案的相关装置。请参阅图8,图8为本申请实施例提供的一种数据索引装置的结构示意图,数据索引装置800包括:
获取单元801,用于获取目标事务,所述目标事务用于指示数据索引过程;
确定单元802,用于根据所述目标事务确定第一存储引擎中的目标数据,所述目标数据包含于至少一个第一索引表中;
映射单元803,用于根据所述第一索引表确定在第二存储引擎中配置的至少一个第二索引表,所述第二索引表为基于所述第一索引表增加行标识所得,所述行标识用于指示所述目标数据中的行数据,所述行数据与所述目标数据中的索引列相对应,所述索引列基于所述目标事务所得,所述第二存储引擎支持所述目标事务的执行;
索引单元804,用于从所述第二索引表中确定与所述第一存储引擎中的数据索引条件对应的索引数据,所述索引数据包含于所述目标数据。
可选的,在本申请一些可能的实现方式中,所述索引单元804,具体用于获取所述目标事务在所述第一存储引擎中的数据索引条件,以确定所述数据索引条件指示的行标识;
所述索引单元804,具体用于根据所述数据索引条件指示的行标识确定在所述第二索引表中对应的行标识,以得到所述行数据;
所述索引单元804,具体用于根据所述行数据确定对应的索引数据。
可选的,在本申请一些可能的实现方式中,所述数据索引条件包括目标索引值,所述索引单元804,具体用于根据所述目标索引值确定对应的第二索引表;
所述索引单元804,具体用于确定所述第二索引表中对应于所述目标索引值的行数据,以得到对应的索引数据。
可选的,在本申请一些可能的实现方式中,所述映射单元803,还用于确定所述目标事务中的数据操纵信息,所述数据操纵信息用于指示数据的插入、更新或删除;
所述映射单元803,还用于根据所述数据操纵信息对所述第二索引表进行更新。
可选的,在本申请一些可能的实现方式中,所述映射单元803,具体用于根据所述数据操纵信息确定所述第一索引表中的变化信息;
所述映射单元803,具体用于根据所述变化信息确定在所述第二索引表中对应的行标识;
所述映射单元803,具体用于基于所述行标识确定所述变化信息在所述第二索引表中的对应项,以对所述第二索引表进行更新。
可选的,在本申请一些可能的实现方式中,所述所述映射单元803,具体用于根据所述变化信息确定所述第一存储引擎对应的版本号,以在所述第二存储引擎中生成日志表;
所述映射单元803,具体用于确定所述日志表中相邻的所述第一存储引擎版本号的数据对应情况,以进行数据恢复。
可选的,在本申请一些可能的实现方式中,所述映射单元803,具体用于确定所述变化信息对应的处理流程;
所述映射单元803,具体用于为所述处理流程设置至少一个故障检测点,所述故障检测点基于所述第一存储引擎和所述第二存储引擎的交互过程确定;
所述映射单元803,具体用于基于所述故障检测点确定相邻的所述第一存储引擎版本号的数据对应情况,以进行数据恢复。
可选的,在本申请一些可能的实现方式中,所述索引单元804,具体用于确定所述第二存储引擎中所述日志表中记录的版本号;
所述索引单元804,具体用于根据所述变化信息确定所述第一存储引擎的版本号;
所述索引单元804,具体用于比对所述日志表中记录的版本号和所述第一存储引擎的版本号,以生成差异记录;
所述索引单元804,具体用于根据所述差异记录更新所述第一索引表和所述第二索引表。
可选的,在本申请一些可能的实现方式中,所述映射单元803,还用于确定所述目标事务中的数据库模式信息;
所述映射单元803,还用于根据所述数据库模式信息对所述第二索引表进行更新。
可选的,在本申请一些可能的实现方式中,所述数据库模式信息包括至少一种索引方式,所述映射单元803,具体用于基于所述索引方式对所述第二索引表进行分类,以对所述第二索引表进行更新,所述索引方式包括主键索引、唯一索引或普通索引。
可选的,在本申请一些可能的实现方式中,所述映射单元803,具体用于获取所述数据库模式信息中对于所述行数据的处理信息;
所述映射单元803,具体用于基于所述处理信息提取对应的索引列变化数据;
所述映射单元803,具体用于根据所述索引列变化数据对所述第二索引表进行更新。
通过获取指示数据索引过程目标事务,并根据目标事务确定第一存储引擎中的目标数据,目标数据包含于至少一个第一索引表中;然后根据第一索引表确定在第二存储引擎中配置的至少一个第二索引表,第二索引表为基于第一索引表增加行标识所得,行标识用于指示目标数据中的行数据,行数据与目标数据中的索引列相对应,索引列基于目标事务所得,第二存储引擎支持目标事务的执行;进而从第二索引表中确定与第一存储引擎中的数据索引条件对应的索引数据。从而实现了跨存储引擎的数据索引过程,由于减少了新的存储引擎引入的开发复杂度,实现了多存储引擎的代码复用,提高了数据库的索引效率;进一步的通过对于第二存储引擎的功能设计使得第一存储引擎可以执行自身无法搭载的功能,进一步的提高了数据库的应用范围以及索引效率。
本申请实施例还提供了另一种数据索引装置,请参阅图9,图9是本申请实施例提供的另一种数据索引装置的结构示意图,该数据索引装置900可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processing units,CPU)922(例如,一个或一个以上处理器)和存储器932,一个或一个以上存储应用程序942或数据944的存储介质930(例如一个或一个以上海量存储设备)。其中,存储器932和存储介质930可以是短暂存储或持久存储。存储在存储介质930的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对数据索引装置中的一系列指令操作。更进一步地,中央处理器922可以设置为与存储介质930通信,在数据索引装置900上执行存储介质930中的一系列指令操作。
数据索引装置900还可以包括一个或一个以上电源926,一个或一个以上有线或无线网络接口950,一个或一个以上输入输出接口958,和/或,一个或一个以上操作系统941,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由数据索引装置所执行的步骤可以基于该图9所示的数据索引装置结构。
本申请实施例中还提供一种计算机可读存储介质,该计算机可读存储介质中存储有数据索引指令,当其在计算机上运行时,使得计算机执行如前述图2至图7所示实施例描述的方法中数据索引装置所执行的步骤。
本申请实施例中还提供一种包括数据索引指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如前述图2至图7所示实施例描述的方法中数据索引装置所执行的步骤。
本申请实施例还提供了一种数据索引系统,所述数据索引系统可以包含图8所描述实施例中的数据索引装置,或者图8所描述的数据索引装置。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,数据索引装置,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-onlymemory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。