CN108376156A - 创建数据库索引的方法、装置、服务器及存储介质 - Google Patents
创建数据库索引的方法、装置、服务器及存储介质 Download PDFInfo
- Publication number
- CN108376156A CN108376156A CN201810128060.XA CN201810128060A CN108376156A CN 108376156 A CN108376156 A CN 108376156A CN 201810128060 A CN201810128060 A CN 201810128060A CN 108376156 A CN108376156 A CN 108376156A
- Authority
- CN
- China
- Prior art keywords
- data
- index
- tables
- affairs
- created
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2358—Change logging, detection, and notification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2272—Management thereof
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种创建数据库索引的方法、装置、服务器及存储介质。该方法包括:确定待创建索引的数据表;对所述数据表加上IX锁和S锁;在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;释放所述数据表上的S锁;根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;将所述修改记录合并到所述索引数据中;提交所述索引创建事务。本发明实现了在对数据表创建索引的过程中允许其他事务修改数据表。
Description
技术领域
本发明实施例涉及数据库技术,尤其涉及一种创建数据库索引的方法、装置、服务器及存储介质。
背景技术
随着大数据和云计算时代的到来,数据量的变化正呈现出指数级增长的态势。当一个数据库业务系统在运行过程中,往往会由于某种原因需要对某个数据表新建或者重建一个索引。
现有技术中,在对一个数据表新建或者重建索引时,往往会将该数据表锁死,从而导致其他事务均不能对该数据表进行修改操作,进而导致整个业务系统被挂起而无法有效运行,而且随着数据表中数据量的增大这种影响所持续的时间会随着数据量的增加而增加,这种影响通常是不可接受的。
发明内容
有鉴于此,本发明实施例提供一种创建数据库索引的方法、装置、服务器及存储介质,以实现在对数据表创建索引的过程中允许其他事务修改数据表。
第一方面,本发明实施例提供了一种创建数据库索引的方法,所述方法包括:
根据索引创建事务,确定待创建索引的数据表;
对所述数据表加上IX锁和S锁;
在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
释放所述数据表上的S锁;
根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
将所述修改记录合并到所述索引数据中;
提交所述索引创建事务。
第二方面,本发明实施例还提供了一种创建数据库索引的装置,所述装置包括:
数据表确定模块,用于根据索引创建事务,确定待创建索引的数据表;
上锁模块,用于对所述数据表加上IX锁和S锁;
数据字典添加模块,用于在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
锁释放模块,用于释放所述数据表上的S锁;
索引及修改并发模块,用于根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
索引数据合并模块,用于将所述修改记录合并到所述索引数据中;
事务提交模块,用于提交所述索引创建事务。
第三方面,本发明实施例还提供了一种服务器,所述服务器包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明任一实施例所述的创建数据库索引的方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明任一实施例所述的创建数据库索引的方法。
本发明实施例的技术方案,通过在对数据表加上IX锁和S锁后,在数据库系统表中添加待创建索引的数据字典,然后释放S锁,从而在待创建索引中填充索引数据的同时,其他事务可以同时对所述数据表进行修改,并保存其他事务对数据表的修改记录,之后将所述修改记录合并到所述索引数据中,实现了数据表的索引创建和其他事务对该数据表的修改的并发执行,而且其他事务对数据表的修改操作和索引创建互不影响,即实现了在对数据表创建索引的过程中允许其他事务修改数据表。
附图说明
图1是本发明实施例一提供的一种创建数据库索引的方法的流程图;
图2是本发明实施例二提供的一种创建数据库索引的方法的流程图;
图3是本发明实施例中的合并辅助表中的修改记录到索引数据的流程示意图;
图4是本发明实施例三提供的一种创建数据库索引的方法的流程图;
图5是本发明实施例四提供的一种创建数据库索引的装置的结构示意图;
图6为本发明实施例五提供的一种服务器的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。
实施例一
图1是本发明实施例一提供的一种创建数据库索引的方法的流程图,本实施例可适用于在对数据表创建数据库索引时允许其他事务修改该数据表的情况,该方法可以由创建数据库索引的装置来执行,该装置可以由软件和/或硬件来执行,一般可集成在数据库服务器中。该方法具体包括如下步骤:
步骤101,根据索引创建事务,确定待创建索引的数据表。
在用户需要为数据库中的数据表新建或者重建一个索引时,可以发起一个索引创建事务,该索引创建事务包括待创建索引的数据表,从而根据该索引创建事务,便可以确定待创建索引的数据表。在重建索引时需要把数据表已存在的索引删除,然后再对该数据表新建一个索引。
其中,在关系数据库中、索引是一种单独的、物理的对数据表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑索引清单。索引提供指向存储在数据表的指定列中的数据值的指针,然后根据用户指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后根据指针找到包含该值的行。这样可以使对应于表的查询语句(如SQL语句)执行得更快,可快速访问数据表中的特定信息。当数据表中有大量记录时,若要对数据表进行查询,在数据表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID快速找到数据表中对应的记录。其中,ROWID是数据表中每一行数据的唯一标识符。
步骤102,对所述数据表加上IX锁和S锁。
其中,加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据库对象进行操作前,需要先对其加锁。加锁后事务就对该数据库对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据库对象进行相应操作。数据库使用四种锁:意向共享锁(IS)、意向排他锁(IX)、共享锁(S)和排他锁(X)。四种锁的封锁力度如下:
IS锁:事务T在对数据表加IS锁之后,事务T就可以查询该数据表了,但不允许其他事务独占修改(加X锁)该数据表。其他事务可以同时增、删、改、查该数据表的数据,也支持在该数据表上创建索引,但不支持修改该数据表的定义;
IX锁:事务T在对数据表加IX锁之后,事务T就可以查询并修改该数据表了,但不允许其他事务独占查询(加S锁)和独占修改(加X锁)该数据表。其他事务可以同时增、删、改、查该数据表的数据,但不支持在该数据表上创建索引,也不支持修改该数据表的定义;
S锁:若事务T对数据表加上S锁,则事务T可以查询该数据表但不能修改该数据表,其他事务只能共享查询该数据表(加S锁或IS锁),但不允许增、删、改该数据表的数据;
X锁:若事务T对数据表加上X锁,则只允许T查询并修改该数据表,其他事务不能再对A加作何类型的锁,直到T释放A上的X锁。X锁是封锁力度最大的一种封锁方式。
四种锁相互之间的相容矩阵如表1所示,其中,“Y”表示相容;“N”表示不相容。如表1中第二行第二列为“Y”,表示如果某个事务对一个数据表已经加了IS锁时,其他事务还可以对该数据表继续添加IS锁;第二行第五列为“N”,表示如果某个事务已经对一个数据表加了IS锁时,其他事务不能再对该数据表添加X锁。
表1不同事务之间锁的相容矩阵
IS | IX | S | X | |
IS | Y | Y | Y | N |
IX | Y | Y | N | N |
S | Y | N | Y | N |
X | N | N | N | N |
在所述索引创建事务对待创建索引的数据表加上IX锁和S锁。因为IX锁只能兼容IS锁和IX锁,而S锁只能兼容IS锁和S锁,综合起来,IX锁和S锁只能兼容IS锁了。因此,其他事务只能对该数据表加IS锁,所以其他事务只能对数据表做查询操作。对该数据表加IX和S锁,是为了在索引创建期间,禁止其他事务除了查询操作之外对于该数据表的所有并发DML(Data Manipulation Language,数据操纵语言)操作。由于查询不涉及数据表中的数据修改,所以,所述索引创建事务不需要限制其他事务对数据表的查询操作。其中,DML操作包括插入操作、删除操作和更新操作中的至少一种。
步骤103,在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引。
其中,数据库系统表是数据库内部维护的表。数据字典用来描述数据库对象的基本信息,主要包括对象名、对象类型、对象成员、创建时间等描述数据库对象的属性的内容。
在数据库系统表中添加待创建索引的描述信息,即该待创建索引的数据字典,并确定对应的待创建索引(如确定对应的待创建索引的索引B树,该索引B树为空的,即还没有填充数据),该待创建索引为空白的。该步骤用时较短,后续释放S锁后,其他事务就可以对该数据表进行DML操作了。
步骤104,释放所述数据表上的S锁。
添加待创建索引的数据字典后,可以释放数据表上的S锁,只保留IX锁。这样做的目的,是放开对于所述数据表除DDL操作外的并发操作。从而,其他事务对所述数据表的DML操作可以与后续的索引创建并发执行。
本事务对数据表上了IX锁之后,其他事务就不能独占查询和独占修改该数据表了。一个数据表被上了IX锁后,其他事务可以同时对该数据表进行DML操作,但不能做与该数据表有关的DDL(Data Definition Language,数据定义语言)操作,即不能在该表上创建索引,也不能修改该表的定义。其中,DDL操作是对数据库对象的操作,包括对数据库对象的创建、删除和修改中的至少一种。
步骤105,根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录。
根据所述数据字典,扫描数据表,获取到原始数据表的数据,从而在待创建索引中填充对应的索引数据。在向待创建索引中填充索引数据的同时,如果接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,生成对应的修改记录,并保存该修改记录。
其中,所述索引数据的数据结构可以为B树索引、B-树索引、B+树索引或B*树索引等。B树索引的结构为:索引的顶层为根,它包括指向索引中下一层次的条目。下一层次为分支块,它又指向位于索引中下一层索引中下一层次的块,最底层的是叶节点,它包含指向表行的索引条目。
步骤106,将所述修改记录合并到所述索引数据中。
在根据原始数据表将对应的索引数据填充完毕时,将每一条修改记录合并到所述索引数据中。
步骤107,提交所述索引创建事务。
最后,索引创建完毕,待创建索引成为已创建完成的索引,提交该索引创建事务,从而后续对该数据表进行查询时,可以先查询该索引。
本实施例的技术方案,通过在对数据表加上IX锁和S锁后,在数据库系统表中添加待创建索引的数据字典,然后释放S锁,从而在待创建索引中填充索引数据的同时,其他事务可以对所述数据表进行修改,并保存其他事务对数据表的修改记录,之后将所述修改记录合并到所述索引数据中,实现了数据表的索引创建和其他事务对该数据表的修改的并发执行,而且其他事务对数据表的修改操作和索引创建互不影响,即实现了在对数据表创建索引的过程中允许其他事务修改数据表。
在上述技术方案的基础上,在提交所述索引创建事务之前,还可选包括:
重新对所述数据表加上S锁。
通过步骤105和步骤106的操作,为数据表创建索引完成,重新对数据表加上S锁,禁止其他事务对所述数据表进行修改操作,并便于对当前的索引创建事务做结束操作,避免了在提交该索引创建事务期间其他事务对数据表的修改操作没有合并到索引中。
在上述技术方案的基础上,还可选包括:
在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引后,将所述待创建索引设置为非生效状态;
在提交所述索引创建事务之前,将所述待创建索引设置为生效状态。
在数据库系统表中添加所述待创建索引的数据字典后,将该待创建索引设置为非生效状态,可以避免该待创建索引被用于查询检索,因为此时的待创建索引尚未填充索引数据,即还没有创建完成,此时若用于查询检索,则会导致无法查询到预期结果。
在提交所述索引创建事务之前,即已经在所述待创建索引中填充了有效的所有数据,该待创建索引可以正常用于检索,此时,将所述待创建索引设置为生效状态,从而可以将该待创建索引用于查询检索,提高查询检索的效率。具体的,可以在重新对所述数据表加上S锁之后,提交所述索引创建事务之前,将所述索引设置为生效状态。
实施例二
图2是本发明实施例二提供的一种创建数据库索引的方法的流程图,本实施例在上述实施例的基础上进行了优化,具体的,通过创建用于触发保存修改记录的辅助表和辅助触发器,从而根据辅助表中的修改记录来合并索引数据。该方法具体包括如下步骤:
步骤201,根据索引创建事务,确定待创建索引的数据表。
步骤202,对所述数据表加上IX锁和S锁。
步骤203,在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引,创建用于保存修改记录的辅助表和对应的辅助触发器。
在数据库系统表中添加所述待创建索引的数据字典的同时,创建用于保存其他事务对所述数据表的修改记录的辅助表和对应的辅助触发器。
其中,辅助表用于记录其他各事务对所述数据表的数据修改操作,便于后续将该表中记录的修改合并到索引中。所述辅助表包括:索引的所有索引值、修改记录的ROWID和操作类型。其中,操作类型包括插入和删除,对于更新操作则拆分为对于老值的删除操作和对于新值的插入操作。辅助触发器用于在所述数据表中的数据发生变化时,自动触发生成相应修改记录,保存在辅助表中。
通过辅助表和辅助触发器用来记录其他事务对所述数据表的操作,从而达到数据表操作和索引创建互不影响的目的。
步骤204,释放所述数据表上的S锁。
步骤205,根据所述数据字典,扫描所述数据表,在所述待创建索引中填充索引数据,并通过辅助触发器在检测到除所述索引创建事务之外的其他事务对所述数据表进行修改时,生成对应的修改记录,并保存到所述辅助表中。
在索引创建中,填充索引数据是最耗时的。通过根据所述数据字典,扫描所述数据表,获取到索引创建事务开始时数据表的数据,从而根据该数据在待创建索引中填充对应的索引数据。本发明实施例通过在向待创建索引中填充索引数据的同时,通过辅助触发器来检测其他事务对数据表的修改操作,并生成对应的修改记录,保存到辅助表中,实现了索引创建和其他事务的修改操作的并行执行。
其中,根据多版本控制原理,当前事务即所述索引创建事务只可以看见当前版本的数据。所以,不论其他事务会做怎样的修改,当前事务扫描到的都是当前版本的数据表数据,而对于数据表的新修改操作全部被记录在辅助表中。
步骤206,扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录。
通过一条一条地扫描辅助表中的修改记录,将扫描到的一条修改记录合并到索引数据中,同时在辅助表中删除该条修改记录。
其中,图3是本发明实施例中的合并辅助表中的修改记录到索引数据的流程示意图,如图3所示,扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录,可选包括:
步骤2061,设置不可见记录计数并赋值为0,更新所述索引创建事务的可见事务列表,其中,所述不可见记录计数用于记录对所述索引创建事务不可见的其他事务对于所述数据表修改的记录的数量;
步骤2062,扫描所述辅助表中的修改记录;
步骤2063,判断是否扫描得到一条修改记录,如果是,则执行步骤2064,如果否,则执行步骤2067;
步骤2064,根据所述可见事务列表判断该条修改记录对所述索引创建事务是否可见,如果可见,则执行步骤2065,如果不可见,则执行步骤2066;
步骤2065,将该条修改记录合并到所述索引数据中,并在辅助表中删除该条修改记录,之后执行步骤2062继续扫描所述辅助表中的下一条修改记录;
步骤2066,将不可见记录计数加1,之后执行步骤2062继续扫描所述辅助表中的下一条修改记录。
步骤2067,判断所述不可见记录计数是否大于0,如果是,则执行步骤2061,如果否,则合并辅助表中的修改记录合并完成,可以执行后续步骤。
其中,其他事务是指该索引创建事务之外的增删改事务,即在索引创建事务的执行过程中,对于该数据表的增删改事务同时并发执行,并且增删改事务未提交,则其对应的修改记录对于当前的索引创建事务就是不可见的。由于存在不可见的记录,因此对于索引的合并无法一次性完成,需要一直合并直至所有的增删改事务所做的修改记录对当前的索引创建事务都可见为止。每个事务启动时都会收集一个当前系统中对于本事务可见的事务列表,这些事务对于数据库的修改对于本事务是可见的,因此,所述可见事务列表是指对于当前的索引创建事务可见的事务的列表。
步骤207,提交所述索引创建事务。
本实施例的技术方案,通过利用辅助触发器来检测其他事务对所述数据表的修改操作,并生成对应的修改记录,保存到辅助表中,后续可以直接合并辅助表中的修改记录到索引数据中,提高了对其他事务的修改记录的准确性。
在上述实施例的基础上,在提交所述索引创建事务之前,还可选包括:
重新对所述数据表加上S锁。
在对数据表创建索引完成后,重新对数据表加上S锁,禁止其他事务对所述数据表进行修改操作,并便于对当前的索引创建事务做结束操作,避免了在提交该索引创建事务期间其他事务对数据表的修改操作没有合并到待创建索引中。
在上述实施例的基础上,还可选包括:
删除所述辅助表和对应的辅助触发器。
在将辅助表中的修改记录合并到索引数据中后,即设置索引为生效状态后,可以删除辅助表和对应的辅助触发器,及时释放存储空间。
实施例三
图4是本发明实施例三提供的一种创建数据库索引的方法的流程图,本实施例在上述实施例的基础上进行了优化,具体的,通过根据重新对所述数据表加上S锁是否上锁成功来确定是否继续合并辅助表中的修改记录到索引数据中。该方法具体包括如下步骤:
步骤301,根据索引创建事务,确定待创建索引的数据表。
步骤302,对所述数据表加上IX锁和S锁。
步骤303,在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引,创建用于保存修改记录的辅助表和对应的辅助触发器。
步骤304,释放所述数据表上的S锁。
步骤305,根据所述数据字典,扫描所述数据表,在所述待创建索引中填充索引数据,并通过辅助触发器在检测到除所述索引创建事务之外的其他事务对所述数据表进行修改时,生成对应的修改记录,并保存到所述辅助表中。
步骤306,扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录。
步骤307,重新对所述数据表加上S锁,并判断是否上锁成功,如果是,则执行步骤308,如果否,则执行步骤306。
重新对所述数据表加上S锁,并确定上锁结果。如果上锁结果为上锁失败(例如,其他事务已经上了IX锁,本事务就不能再上S锁了,直到其他事务释放掉IX锁为止),则说明其他事务正在修改所述数据表,可能还有新修改的数据尚未合并完成,则跳转到步骤306;如果上锁结果为上锁成功,说明此刻没有其他事务在修改所述数据表了,之后执行步骤308。
步骤308,检查所述辅助表是否为空,如果是,则执行步骤310,如果否,则执行步骤309。
检查辅助表是否为空,如果为空,表示全部合并完毕,则执行步骤310。如果不为空,则说明辅助表中有尚未合并的数据(说明在步骤306之后,成功上S锁之前这段并发窗口期内,又有其他事务成功修改了所述数据表),则执行步骤309。
步骤309,释放所述数据表的S锁,之后执行步骤306。
释放所述数据表的S锁并跳转到步骤306重新开始数据合并。
步骤310,提交所述索引创建事务。
本实施例的技术方案,通过上锁结果来确定辅助表中的修改记录是否合并完成,并在未合并完成时继续进行合并,直至合并完成,从而可以将所有的其他事务的修改操作合并到索引数据中,使得建立的索引更加准确。
实施例四
图5是本发明实施例四提供的一种创建数据库索引的装置的结构示意图,本实施例可适用于在对数据表创建数据库索引时允许其他事务修改该数据表的情况,该装置可以由软件和/或硬件来执行,一般可集成在数据库服务器中。如图5所示,本实施例所述的创建数据库索引的装置包括:数据表确定模块401、上锁模块402、数据字典添加模块403、锁释放模块404、索引及修改并发模块405、索引数据合并模块406和事务提交模块407。
其中,数据表确定模块401,用于根据索引创建事务,确定待创建索引的数据表;
上锁模块402,用于对所述数据表加上IX锁和S锁;
数据字典添加模块403,用于在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
锁释放模块404,用于释放所述数据表上的S锁;
索引及修改并发模块405,用于根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
索引数据合并模块406,用于将所述修改记录合并到所述索引数据中;
事务提交模块407,用于提交所述索引创建事务。
可选的,还包括:
索引状态设置模块,用于在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引后,将所述待创建索引设置为非生效状态;在提交所述索引创建事务之前,将所述待创建索引设置为生效状态。
可选的,还包括:
辅助表和辅助触发器创建模块,用于在数据库系统表中添加所述待创建索引的数据字典的同时,创建用于保存所述修改记录的辅助表和对应的辅助触发器;
所述索引及修改并发模块具体用于:
根据所述数据字典,扫描所述数据表,在所述待创建索引中填充索引数据,并通过辅助触发器在检测到除所述索引创建事务之外的其他事务对所述数据表进行修改时,生成对应的修改记录,并保存到所述辅助表中;
所述索引数据合并模块具体用于:
扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录。
可选的,还包括:
重新上S锁模块,用于在提交所述索引创建事务之前,重新对所述数据表加上S锁。
可选的,所述重新上S锁模块具体用于:
在重新对所述数据表加上S锁时,如果上锁失败,则重新触发所述索引数据合并模块的操作;
如果上锁成功,则检查所述辅助表是否为空,如果所述辅助表不为空,则释放所述数据表的S锁,并重新触发所述索引数据合并模块的操作;如果所述辅助表为空,则触发事务提交模块的操作。
可选的,所述索引数据合并模块包括:
设置单元,用于设置不可见记录计数并赋值为0,更新所述索引创建事务的可见事务列表,其中,所述不可见记录计数用于记录对所述索引创建事务的不可见的其他事务对于所述数据表修改的记录的数量;
扫描单元,用于扫描所述辅助表中的修改记录;
索引数据合并单元,用于在扫描得到一条修改记录时,根据所述可见事务列表判断该条修改记录对所述索引创建事务是否可见,在该条修改记录对所述索引创建事务可见时,将该条修改记录合并到所述索引数据中,并在辅助表中删除该条修改记录;在该条修改记录对所述索引创建事务不可见时,将不可见记录计数加1,并继续往下扫描所述辅助表;
不可见记录计数判断单元,用于在扫描没有得到修改记录时,判断所述不可见记录计数是否大于0,如果是,则重新触发所述设置单元的操作,直到扫描辅助表没有得到修改记录而且所述不可见记录计数等于0。
可选的,还包括:
删除模块,用于删除所述辅助表和对应的辅助触发器。
上述创建数据库索引的装置可执行本发明任意实施例所提供的创建数据库索引的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明任意实施例提供的创建数据库索引的方法。
实施例五
图6为本发明实施例五提供的一种服务器的结构示意图,如图6所示,该服务器包括处理器501、存储器502、输入装置503和输出装置504;服务器中处理器501的数量可以是一个或多个,图6中以一个处理器501为例;服务器中的处理器501、存储器502、输入装置503和输出装置504可以通过总线或其他方式连接,图6中以通过总线连接为例。
存储器502作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的创建数据库索引的方法对应的程序指令/模块(例如,创建数据库索引的装置中的数据表确定模块401、上锁模块402、数据字典添加模块403、锁释放模块404、索引及修改并发模块405、索引数据合并模块406和事务提交模块407)。处理器501通过运行存储在存储器502中的软件程序、指令以及模块,从而执行服务器的各种功能应用以及数据处理,即实现上述的创建数据库索引的方法。
存储器502可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据服务器的使用所创建的数据等。此外,存储器502可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器502可进一步包括相对于处理器501远程设置的存储器,这些远程存储器可以通过网络连接至服务器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置503可用于接收输入的数字或字符信息,以及产生与服务器的用户设置以及功能控制有关的键信号输入。输出装置504可包括显示屏等显示设备。
实施例六
本发明实施例六还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种创建数据库索引的方法,该方法包括:
根据索引创建事务,确定待创建索引的数据表;
对所述数据表加上IX锁和S锁;
在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
释放所述数据表上的S锁;
根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
将所述修改记录合并到所述索引数据中;
提交所述索引创建事务。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的创建数据库索引的方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
值得注意的是,上述创建数据库索引的装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种创建数据库索引的方法,其特征在于,所述方法包括:
根据索引创建事务,确定待创建索引的数据表;
对所述数据表加上IX锁和S锁;
在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
释放所述数据表上的S锁;
根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
将所述修改记录合并到所述索引数据中;
提交所述索引创建事务。
2.根据权利要求1所述的方法,其特征在于,还包括:
在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引后,将所述待创建索引设置为非生效状态;
在提交所述索引创建事务之前,将所述待创建索引设置为生效状态。
3.根据权利要求1或2所述的方法,其特征在于,在数据库系统表中添加所述待创建索引的数据字典时,还包括:
创建用于保存所述修改记录的辅助表和对应的辅助触发器;
根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录,包括:
根据所述数据字典,扫描所述数据表,在所述待创建索引中填充索引数据,并通过辅助触发器在检测到除所述索引创建事务之外的其他事务对所述数据表进行修改时,生成对应的修改记录,并保存到所述辅助表中;
将所述修改记录合并到所述索引数据中,包括:
扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录。
4.根据权利要求3所述的方法,其特征在于,在提交所述索引创建事务之前,还包括:
重新对所述数据表加上S锁。
5.根据权利要求4所述的方法,其特征在于,重新对所述数据表加上S锁,包括:
在重新对所述数据表加上S锁时,如果上锁失败,则返回执行扫描辅助表并合并扫描到的修改记录到所述索引数据的操作;
如果上锁成功,则检查所述辅助表是否为空,如果所述辅助表不为空,则释放所述数据表的S锁,并返回执行扫描辅助表并合并扫描到的修改记录到所述索引数据的操作;如果所述辅助表为空,则执行提交所述索引创建事务的操作。
6.根据权利要求4或5所述的方法,其特征在于,扫描所述辅助表中的修改记录,将扫描到的修改记录合并到所述索引数据中,并在辅助表中删除该修改记录,包括:
设置不可见记录计数并赋值为0,更新所述索引创建事务的可见事务列表,其中,所述不可见记录计数用于记录对所述索引创建事务不可见的其他事务对于所述数据表修改的记录的数量;
扫描所述辅助表中的修改记录;
在扫描得到一条修改记录时,根据所述可见事务列表判断该条修改记录对所述索引创建事务是否可见,在该条修改记录对所述索引创建事务可见时,将该条修改记录合并到所述索引数据中,并在辅助表中删除该条修改记录;在该条修改记录对所述索引创建事务不可见时,将不可见记录计数加1,并继续往下扫描所述辅助表;
在扫描没有得到修改记录时,判断所述不可见记录计数是否大于0,如果是,则返回重新执行设置不可见记录计数并赋值为0及更新可见事务列表的操作,直到扫描辅助表没有得到修改记录而且所述不可见记录计数等于0。
7.根据权利要求3所述的方法,其特征在于,还包括:
删除所述辅助表和对应的辅助触发器。
8.一种创建数据库索引的装置,其特征在于,所述装置包括:
数据表确定模块,用于根据索引创建事务,确定待创建索引的数据表;
上锁模块,用于对所述数据表加上IX锁和S锁;
数据字典添加模块,用于在数据库系统表中添加所述待创建索引的数据字典,并确定对应的待创建索引;
锁释放模块,用于释放所述数据表上的S锁;
索引及修改并发模块,用于根据所述数据表和所述数据字典,在所述待创建索引中填充索引数据,并在接收到除所述索引创建事务之外的其他事务对所述数据表的修改时,保存对应的修改记录;
索引数据合并模块,用于将所述修改记录合并到所述索引数据中;
事务提交模块,用于提交所述索引创建事务。
9.一种服务器,其特征在于,所述服务器包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的创建数据库索引的方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7中任一所述的创建数据库索引的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810128060.XA CN108376156B (zh) | 2018-02-08 | 2018-02-08 | 创建数据库索引的方法、装置、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810128060.XA CN108376156B (zh) | 2018-02-08 | 2018-02-08 | 创建数据库索引的方法、装置、服务器及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108376156A true CN108376156A (zh) | 2018-08-07 |
CN108376156B CN108376156B (zh) | 2020-08-14 |
Family
ID=63017375
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810128060.XA Active CN108376156B (zh) | 2018-02-08 | 2018-02-08 | 创建数据库索引的方法、装置、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108376156B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710629A (zh) * | 2019-01-08 | 2019-05-03 | 上海达梦数据库有限公司 | 数据访问方法、装置、服务器和存储介质 |
CN111694799A (zh) * | 2020-04-30 | 2020-09-22 | 武汉达梦数据库有限公司 | 基于日志解析同步的并行日志解析方法和数据同步系统 |
CN112015729A (zh) * | 2019-05-29 | 2020-12-01 | 核桃运算股份有限公司 | 数据管理装置、方法及其计算机存储介质 |
CN112364027A (zh) * | 2020-12-09 | 2021-02-12 | 北京海量数据技术股份有限公司 | 并行创建openGauss分区表索引方法、装置及系统 |
CN113536058A (zh) * | 2021-08-03 | 2021-10-22 | 上海达梦数据库有限公司 | 一种空间索引修改方法、装置、设备及存储介质 |
CN114661719A (zh) * | 2022-03-28 | 2022-06-24 | 北京海量数据技术股份有限公司 | 一种在OpenGauss数据库分区表上在线创建全局索引的方法 |
CN117453682A (zh) * | 2023-09-26 | 2024-01-26 | 广州海量数据库技术有限公司 | 在openGauss数据库上并行创建列存表btree索引的方法和系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103246696A (zh) * | 2013-03-21 | 2013-08-14 | 宁波公众信息产业有限公司 | 高并发数据库的访问方法及应用于多服务器系统的方法 |
CN103605657A (zh) * | 2013-10-14 | 2014-02-26 | 华为技术有限公司 | 一种在线重建索引的方法和装置 |
CN105373566A (zh) * | 2014-08-30 | 2016-03-02 | 华为技术有限公司 | 在线重建索引方法及装置 |
CN107193688A (zh) * | 2017-04-25 | 2017-09-22 | 北京潘达互娱科技有限公司 | 数据表结构修改方法及装置 |
US20170277744A1 (en) * | 2016-03-23 | 2017-09-28 | International Business Machines Corporation | Transactional table truncation for concurrent transactions |
-
2018
- 2018-02-08 CN CN201810128060.XA patent/CN108376156B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103246696A (zh) * | 2013-03-21 | 2013-08-14 | 宁波公众信息产业有限公司 | 高并发数据库的访问方法及应用于多服务器系统的方法 |
CN103605657A (zh) * | 2013-10-14 | 2014-02-26 | 华为技术有限公司 | 一种在线重建索引的方法和装置 |
CN105373566A (zh) * | 2014-08-30 | 2016-03-02 | 华为技术有限公司 | 在线重建索引方法及装置 |
US20170277744A1 (en) * | 2016-03-23 | 2017-09-28 | International Business Machines Corporation | Transactional table truncation for concurrent transactions |
CN107193688A (zh) * | 2017-04-25 | 2017-09-22 | 北京潘达互娱科技有限公司 | 数据表结构修改方法及装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710629A (zh) * | 2019-01-08 | 2019-05-03 | 上海达梦数据库有限公司 | 数据访问方法、装置、服务器和存储介质 |
CN109710629B (zh) * | 2019-01-08 | 2020-12-18 | 上海达梦数据库有限公司 | 数据访问方法、装置、服务器和存储介质 |
CN112015729A (zh) * | 2019-05-29 | 2020-12-01 | 核桃运算股份有限公司 | 数据管理装置、方法及其计算机存储介质 |
CN112015729B (zh) * | 2019-05-29 | 2024-04-02 | 核桃运算股份有限公司 | 数据管理装置、方法及其计算机存储介质 |
CN111694799A (zh) * | 2020-04-30 | 2020-09-22 | 武汉达梦数据库有限公司 | 基于日志解析同步的并行日志解析方法和数据同步系统 |
CN111694799B (zh) * | 2020-04-30 | 2023-04-25 | 武汉达梦数据库股份有限公司 | 基于日志解析同步的并行日志解析方法和数据同步系统 |
CN112364027A (zh) * | 2020-12-09 | 2021-02-12 | 北京海量数据技术股份有限公司 | 并行创建openGauss分区表索引方法、装置及系统 |
CN113536058A (zh) * | 2021-08-03 | 2021-10-22 | 上海达梦数据库有限公司 | 一种空间索引修改方法、装置、设备及存储介质 |
CN114661719A (zh) * | 2022-03-28 | 2022-06-24 | 北京海量数据技术股份有限公司 | 一种在OpenGauss数据库分区表上在线创建全局索引的方法 |
CN114661719B (zh) * | 2022-03-28 | 2023-04-28 | 北京海量数据技术股份有限公司 | 一种在OpenGauss数据库分区表上在线创建全局索引的方法 |
CN117453682A (zh) * | 2023-09-26 | 2024-01-26 | 广州海量数据库技术有限公司 | 在openGauss数据库上并行创建列存表btree索引的方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108376156B (zh) | 2020-08-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108376156A (zh) | 创建数据库索引的方法、装置、服务器及存储介质 | |
US9798759B2 (en) | Delegation of database post-commit processing | |
US10255309B2 (en) | Versioned insert only hash table for in-memory columnar stores | |
US10042552B2 (en) | N-bit compressed versioned column data array for in-memory columnar stores | |
EP3026579B1 (en) | Forced ordering of a dictionary storing row identifier values | |
US20160147819A1 (en) | Migration of Unified Table Metadata Graph Nodes | |
US20150310129A1 (en) | Method of managing database, management computer and storage medium | |
CN104268295A (zh) | 一种数据查询方法及装置 | |
CN104423982B (zh) | 请求的处理方法和处理设备 | |
CN104111958A (zh) | 一种数据查询方法及装置 | |
US20130198218A1 (en) | Database Table Partitioning Allowing Overlaps Used in Full Text Query | |
US20170139909A1 (en) | Value-based differential data | |
US20150363442A1 (en) | Index merge ordering | |
US10621173B2 (en) | Data processing device, data processing method, and recording medium | |
CN112867999A (zh) | 基于版本的表锁定 | |
US10013442B2 (en) | Database value identifier hash map | |
US9858310B2 (en) | Maintaining in-memory database consistency by parallelizing persistent data and log entries | |
CN104573112A (zh) | Oltp集群数据库中页面查询方法及数据处理节点 | |
CN113918605A (zh) | 数据查询方法、装置、设备以及计算机存储介质 | |
US11163766B2 (en) | Unique key lookup with additional filter | |
US20090193060A1 (en) | Efficient query processing of dml sql statements | |
CN112818010B (zh) | 数据库查询方法及装置 | |
US7565217B2 (en) | Traversal of empty regions in a searchable data structure | |
KR20230122681A (ko) | 스탠드 인 테이블들 | |
US11556532B2 (en) | Hash trie based optimization of database operations |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |