CN114328500A - 一种数据访问方法、装置、设备及计算机可读存储介质 - Google Patents
一种数据访问方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN114328500A CN114328500A CN202011049612.1A CN202011049612A CN114328500A CN 114328500 A CN114328500 A CN 114328500A CN 202011049612 A CN202011049612 A CN 202011049612A CN 114328500 A CN114328500 A CN 114328500A
- Authority
- CN
- China
- Prior art keywords
- node
- memory
- data
- data page
- storage address
- 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.)
- Pending
Links
Images
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/21—Design, administration or maintenance of databases
-
- 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
-
- 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/28—Databases characterised by their database models, e.g. relational or object models
Abstract
本公开涉及一种数据访问方法、装置、设备及计算机可读存储介质。本公开通过待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,从该数据结构中确定出具有父子关系的第一节点和第二节点,其中,第一节点是第二节点的子节点,第一节点包括目标数据的标识信息。由于该数据结构不仅是数据库中数据的组织形式,同时该数据结构还用于管理内存,也就是说在本实施例中不需要专门设立哈希表对内存进行管理。从而在内存粒度上实现了无锁化,由于只是在数据页的粒度上加锁,因此大大减小了加锁的数据粒度,从而在高并发场景下,避免内存访问成为性能瓶颈,保证了数据库的吞吐量,从而有效提高了计算机系统性能。
Description
技术领域
本公开涉及信息技术领域,尤其涉及一种数据访问方法、装置、设备及计算机可读存储介质。
背景技术
随着信息技术的不断发展,人们在工作和生活中会产生大量的数据,通常情况下会将这些大量的数据存储到数据库中。其中,数据库中经常被访问的数据可以存储在内存中。
现有技术采用哈希表的方式管理内存,主要体现在内存中数据的插入、删除、查找等方面。通常情况下,在对内存中的数据进行插入、删除、查找等访问处理之前,需要给哈希表加锁。
当计算机系统中的某个线程给哈希表加互斥锁后,将导致其他线程无法对内存中的数据进行访问,从而导致计算机系统性能降低。即使将哈希表拆分为多个部分,给哈希表的部分加互斥锁,也并不能从根本上解决计算机系统性能低的问题。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开提供了一种数据访问方法、装置、设备及计算机可读存储介质,在高并发场景下,避免内存访问成为性能瓶颈,保证了数据库的吞吐量,从而有效提高了计算机系统性能。
第一方面,本公开实施例提供一种数据访问方法,包括:
获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息;
根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息;
若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
第二方面,本公开实施例提供一种数据访问装置,包括:
获取模块,用于获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息;
遍历模块,用于根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历;
确定模块,用于确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息;
访问模块,用于若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
第三方面,本公开实施例提供一种数据访问设备,包括:
存储器;
处理器;以及
计算机程序;
其中,所述计算机程序存储在所述存储器中,并被配置为由所述处理器执行以实现如第一方面所述的方法。
第四方面,本公开实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行以实现第一方面所述的方法。
本公开实施例提供的数据访问方法、装置、设备及计算机可读存储介质,通过待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,从该数据结构中确定出具有父子关系的第一节点和第二节点,其中,第一节点是第二节点的子节点,第一节点包括目标数据的标识信息。由于该数据结构不仅是数据库中数据的组织形式,同时该数据结构还用于管理内存,也就是说在本实施例中不需要专门设立哈希表对内存进行管理。另外,在本实施例中,当子节点对应的数据页已经缓存在内存时,可以在该子节点的父节点中记录该子节点对应的数据页在内存中的存储地址。如此,当某个线程需要访问内存中某个子节点对应的数据页时,只需对该子节点的父节点进行加锁即可,由于一个父节点下的子节点个数是有限的几个子节点,因此,对一个父节点进行加锁,只是避免其他线程对内存中该有限个子节点对应的数据页进行访问,不会导致其他线程无法对内存中所有的数据页或大部分的数据页进行访问,从而在内存粒度上实现了无锁化,由于只是在数据页的粒度上加锁,因此大大减小了加锁的数据粒度,从而在高并发场景下,避免内存访问成为性能瓶颈,保证了数据库的吞吐量,从而有效提高了计算机系统性能。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中的一种数据结构的示意图;
图2为本公开实施例提供的一种哈希表的结构示意图;
图3为本公开实施例提供的数据访问方法流程图;
图4为本公开实施例提供的一种数据结构的示意图;
图5为本公开实施例提供的数据访问装置的结构示意图;
图6为本公开实施例提供的数据访问设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
通常情况下,人们在工作和生活中产生的大量数据可以存储到数据库中。数据库的类型有很多,本实施例以关系型数据库(MySQL)为例,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内。也就是说,关系型数据库包括多个表。另外,每个表中的数据是通过一定的数据结构组织起来的。该数据结构可以是树状的数据结构,本实施例以B+Tree的数据结构为例进行示意性说明。关系型数据库中的一个表对应一个B+Tree的数据结构。其中,关系型数据库中的一个表也可以称为一个文件。可以理解的是,在其他实施例中,数据结构不限于B+Tree,例如还可以是二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree)等。其中,B+Tree是在B-Tree的基础上的一种优化。其中,B+Tree也可称为平衡多路查找树,也就是说,平衡多路查找树包括B-Tree和B+Tree这两种结构。
通常情况下,数据库存储在计算机的外部存储设备中,外部存储设备可以简称为外存。外部存储设备例如可以是磁盘、硬盘等。相对于计算机的外部存储设备,计算机的内部存储设备可简称为内存,内存例如可以是计算机内部的存储器。内存用于存储中央处理器(Central Processing Unit,CPU)运算的中间数据和计算结果。另外,数据库中经常被访问的数据也可以存储在内存中。计算机系统从磁盘中读取数据到内存时是以磁盘块为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来。
如图1所示为现有技术中B+Tree数据结构的示意图。如图1所示,B+Tree数据结构包括根节点、非叶子节点和叶子节点。其中,每个节点占用一个磁盘块的磁盘空间。具体的,节点1是根节点,节点2和节点3是非叶子节点,节点4-节点9是叶子节点。节点1占用磁盘块1,节点2占用磁盘块2,依次类推,节点9占用磁盘块9。
另外,关系型数据库中的一个表可包括多条记录,每条记录可占用该表的一行,因此,一条记录也可称为一行记录。具体的,每条记录可记为一个二元组[key,data]。其中,key表示该条记录的键值,即该条记录在对应表中的主键值。data表示一条记录中除主键值外的数据。对于不同的记录,key值互不相同。如图1所示,叶子节点包括主键值和数据。除叶子节点之外的其他节点,例如,根节点和非叶子节点包括主键值和指针,该指针具体可以是子节点所占用的磁盘块的地址。其中,磁盘块的地址具体可以是磁盘块在磁盘中的地址。
例如,以如图1所示的根节点为例,节点2和节点3分别是根节点的子节点。根节点包括指针p2和指针p3,p2表示节点2占用的磁盘块的地址,p3表示节点3占用的磁盘块的地址。
另外,如图1所示,对于每个节点而言,该节点中的主键值个数可以不做具体限定。但是,每个节点中的主键值是按升序排序的。以节点2为例进行示意性说明,节点2中的两个主键值为10和17,指针p4指向的子节点的主键值小于10,指针p5指向的子节点的主键值在10-17之间,指针p6指向的子节点的主键值大于或等于17。
下面以查找主键值29为例,结合图1介绍一下遍历B+Tree的过程:
1、根据根节点找到磁盘块1,将磁盘块1中的内容读入内存,即进行第1次磁盘输入/输出(Input/Output,I/O)操作。
2、比较主键值29和根节点中的主键值28,由于主键值29大于主键值28,因此选取主键值28右侧的指针p3。
3、根据指针p3找到磁盘块3,将磁盘块3中的内容读入内存,即进行第二次磁盘I/O操作。
4、比较主键值29和区间(36,79),找到磁盘块3中的指针p7。
6、根据指针p7找到磁盘块7,将磁盘块7中的内容读入内存,即进行第三次磁盘I/O操作。
7、在磁盘块7中找到关键字29。
通常情况下,数据库中经常被访问的数据可以存储在内存中。在本公开实施例中,内存可以以数据页为单位进行数据缓存,例如,内存中的一个数据页可以缓存B+Tree一个节点中的全部内容。在其他一些实施例中,一个数据页也可以缓存B+Tree多个地址连续的节点中的内容。也就是说,在本实施例中,B+Tree的一些节点中的内容可以以数据页的形式缓存在内存中。B+Tree中的一个节点可以对应内存中的一个数据页。内存中缓存的这些数据页可以是正在被访问的数据页,也可以是热点数据页即被访问频率较高的数据页。另外,在本公开实施例中,内存具体可以是内存池(BufferPool)。
当前采用哈希表的方式对内存进行管理。例如,内存中缓存有如图1所示的节点1对应的数据页、节点3对应的数据页和节点7对应的数据页。节点1的标识可记为spaceid+pageno1,其中,spaceid表示B+Tree对应的文件的标识,例如,文件名。pageno1表示节点1在该文件中的偏移量。由于节点1、节点3和节点7在同一个B+Tree中,因此,节点1、节点3和节点7对应的文件名相同,节点3的标识可记为spaceid+pageno3,节点7的标识可记为spaceid+pageno7。可以理解的是,每个节点的标识可以是该节点占用的磁盘块的地址。在构建哈希表时,分别计算spaceid+pageno1、spaceid+pageno3和spaceid+pageno7的哈希值,例如,spaceid+pageno1的哈希值记为哈希值1,spaceid+pageno3记为哈希值3,spaceid+pageno7的哈希值记为哈希值7。在该哈希表中,每个哈希值对应哈希表中的一个位置,哈希表中的每个位置用于存储一个节点对应的数据页在内存中的存储地址。如图2所示,哈希值1对应的位置存储有节点1对应的数据页在内存中的存储地址,哈希值3对应的位置存储有节点3对应的数据页在内存中的存储地址,哈希值7对应的位置存储有节点7对应的数据页在内存中的存储地址。
在数据访问过程中,根据待访问的目标数据的主键值对B+Tree进行遍历,遍历的过程如上所述,此处不再赘述。例如,目标数据的主键值为29,该目标数据是与主键值29对应的数据。当确定出该目标数据所在的节点为节点7时,根据节点7的标识计算该标识的哈希值,进一步,查询如图2所示的哈希表,确定该标识的哈希值对应的位置是否存储有信息,若该位置中没有存储任何信息,则说明节点7对应的数据页没有缓存在内存中。若该位置存储有相应的地址信息,说明节点7对应的数据页在内存中,此时,可以对内存中缓存的该节点7对应的数据页进行访问,例如,读取、写入、修改、删除等操作。具体的,节点7对应的数据页可包括多条记录,因此,对内存中缓存的该节点7对应的数据页进行访问时,具体可以对该多条记录中的部分记录或全部记录进行读取、写入、修改、删除等操作。
为了避免计算机系统中不同线程对内存中同一数据页的访问产生冲突,每个线程在访问某一数据页之前,可以先给哈希表加锁,数据访问完成后,再释放哈希表上的锁。
例如,以删除操作为例,具体实现过程如下所述:
1)对哈希表加互斥锁。
2)删除内存中缓存的节点7对应的数据页,或删除该数据页中的部分记录。
3)释放哈希表上的互斥锁。
例如,以读取操作为例,具体实现过程如下所述:
1)对哈希表加共享锁。
2)从内存中读取节点7对应的数据页,或者内存中读取该数据页中的部分记录。
3)释放哈希表上的共享锁。
例如,以写入操作为例,具体实现过程如下所述:
1)对哈希表加互斥锁。
2)在内存中缓存的节点7对应的数据页中写入新的记录。
3)释放哈希表上的互斥锁。
例如,以修改操作为例,具体实现过程如下所述:
1)对哈希表加互斥锁。
2)修改内存中缓存的节点7对应的数据页,或者修改该数据页中的部分记录。
3)释放哈希表上的互斥锁。
此外,如果访问的目标数据不在内存时,还需要将目标数据所属的磁盘块中的内容写入到内存中,并在哈希表中记录该内容在内存中对应的数据页的存储地址。
例如,目标数据的主键值为75,通过对B+Tree进行遍历,确定该目标数据在节点8上,但是,在计算出节点8的标识的哈希值后,通过查询哈希表,确定该哈希表中并没有存储有节点8对应的数据页在内存中的存储地址。也就是说,节点8对应的数据页并不在内存中。此时,需要从磁盘中读取磁盘块8中的内容,并将该磁盘块8中的内容写入到内存中新建的一个数据页中。也就是说,需要在内存中插入一个数据页。该插入操作的实现过程如下所述:
1)对哈希表加互斥锁。
2)根据节点8的标识对应的哈希值,从哈希表中确定该哈希值对应的位置,并在该位置上存储节点8对应的数据页在内存中的存储地址。
3)释放哈希表上的互斥锁。
可以理解的是,在对内存中的数据进行访问或者是在内存中插入新的数据页时,需要对哈希表加锁,也就是说,需要在哈希表这样的粒度上进行互斥。由于哈希表是对整个内存进行管理的,对哈希表加锁,相当于给整个内存加了锁。此外,CPU是从内存中取数据,并不是直接从磁盘中取数据,若CPU访问的数据不在内存中,还需要将磁盘中相应的数据缓存到内存中。因此,当某个线程给哈希表加了互斥锁后,将导致其他线程无法访问内存,无法判断该线程访问的数据是否在内存中,进而无法从磁盘中取数据。也就是说,对哈希表加锁,相当于给整个数据库也加了锁。因此,内存是数据库逻辑计算的基础,内存的并发能力直接影响了数据库的吞吐量,以及系统性能。因此,在高并发场景下,给哈希表加锁的方式将导致内存访问成为性能瓶颈,从而使得系统性能较低。即使将哈希表拆分为多个部分,给哈希表的部分加锁,也不能从根本上解决计算机系统性能低的问题。
针对该问题,本公开实施例提供了一种数据访问方法,下面结合具体的实施例对该方法进行介绍。
图3为本公开实施例提供的数据访问方法流程图。该方法具体步骤如下:
S301、获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息。
具体的,待访问的目标数据的标识信息具体可以是待访问的目标数据的主键值。
S302、根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息。
在本实施例中,对于内存中已经缓存的数据页,可以在该数据页对应的节点中增加该数据页在内存中的存储地址。
为了将如上所述的节点所占用的磁盘块的地址与本公开实施例提到的数据页在内存中的存储地址区分开,可以将如上所述的节点所占用的磁盘块的地址记为第一指针,将数据页在内存中的存储地址记为第二指针。也就是说,若B+Tree中某个节点对应的数据页缓存在内存中,则该节点即包括第一指针也包括第二指针。如果B+Tree中某个节点对应的数据页不在内存中,则该节点包括第一指针,不包括第二指针。
例如,内存中缓存有如图4所示的节点1、节点2、节点3、节点7、节点8、节点9分别对应的数据页。其中,节点1对应的数据页在内存中的存储地址记为Father_pointer_page1,节点2对应的数据页在内存中的存储地址记为Child_pointer_page2,节点3对应的数据页在内存中的存储地址记为Child_pointer_page3,节点7对应的数据页在内存中的存储地址记为Child_pointer_page7,节点8对应的数据页在内存中的存储地址记为Child_pointer_page8,节点9对应的数据页在内存中的存储地址记为Child_pointer_page9。
以p2和Child_pointer_page2为例,在节点1中,p2和Child_pointer_page2之间可以存在对应关系。具体的,p2是第一指针,Child_pointer_page2是第二指针。p2表示节点2占用的磁盘块2的位置,Child_pointer_page2表示节点2对应的数据页在内存中的存储地址。
由于节点1是节点2和节点3的父节点,所以在节点1中可以记录有Child_pointer_page2和Child_pointer_page3。
由于节点3是节点7、节点8和节点9的父节点,所以在节点3中可以记录有Child_pointer_page7、Child_pointer_page8、Child_pointer_page9。也就是说,父节点中可以记录子节点对应的数据页在内存中的存储地址。另外,子节点也可以记录其父节点对应的数据页在内存中的存储地址。
例如节点7、节点8和节点9中分别记录有Father_pointer_page3,Father_pointer_page3表示节点3对应的数据页在内存中的存储地址。也就是说,节点7、节点8和节点9中的Father_pointer_page3与节点1中记录的Child_pointer_page3相同。
同理,节点2和节点3中分别记录有节点1对应的数据页在内存中的存储地址即Father_pointer_page1。
也就是说,如图4所示的B+Tree不仅是数据库对应的数据结构,同时,该B+Tree还可用于管理内存,即在本实施例中,不需要采用哈希表的方式对内存进行管理。
进一步,根据待访问的目标数据的主键值,可以对如图4所示的B+Tree进行遍历。
可选的,所述数据结构为树状的数据结构;所述对数据库对应的数据结构进行遍历,包括:从根节点开始对数据库对应的数据结构进行遍历。
例如,节点1为根节点(root node),目标数据的主键值为29,如图4所示,从根节点开始对B+Tree进行遍历。具体的,从根节点开始一直访问到叶子节点。具体遍历过程包括如下步骤:
1)对根节点加共享锁。
2)读取根节点中的内容,比较主键值29和主键值28后,选取指针p3,并读取Child_pointer_page3。
3)释放根节点的共享锁。
4)对节点3加共享锁。
5)根据Child_pointer_page3,从内存中读取节点3对应的数据页,比较主键值29和区间(36,79),选取指针p7,并读取Child_pointer_page7。
6)释放节点3的共享锁。
7)对节点7加共享锁。
8)根据Child_pointer_page7,从内存中读取节点7对应的数据页,在该数据页中找到关键字29。
9)释放节点7的共享锁。
通过对如图4所示的B+Tree进行遍历,可以确定出节点7和节点3,其中,节点7是节点3的子节点,节点3是节点7的父节点。节点7包括目标数据的主键值29。此处,可以将包括目标数据的主键值29的节点7记为第一节点,将节点3记为第二节点。
S303、若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
如图4所示,由于节点3包括节点7对应的数据页在内存中的存储地址即Child_pointer_page7,说明节点7对应的数据页在内存中。因此,可以直接对内存中存储的节点7对应的数据页进行访问。具体的,当计算机系统中的某个线程需要对内存中存储的节点7对应的数据页进行访问时,该线程可以先对节点3加锁,进一步,根据节点7对应的数据页在内存中的存储地址即Child_pointer_page7,找到内存中存储的节点7对应的数据页,并对节点7对应的数据页进行访问,访问之后释放节点3上的锁。对节点7对应的数据页进行访问时,具体可以对该数据页中的全部记录或部分记录进行删除、修改、写入、读取等操作。
可选的,若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则所述第一节点还包括所述第二节点对应的第二数据页在内存中的存储地址。
如图4所示,节点7是节点3的子节点,节点3是节点7的父节点。节点7记为第一节点,节点3记为第二节点。当节点3包括节点7对应的数据页在内存中的存储地址即Child_pointer_page7时,节点7也可以包括节点3对应的数据页在内存中的存储地址即Father_pointer_page3。具体的,可以将第一节点对应的数据页记为第一数据页,将第二节点对应的数据页记为第二数据页。
本公开实施例通过待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,从该数据结构中确定出具有父子关系的第一节点和第二节点,其中,第一节点是第二节点的子节点,第一节点包括目标数据的标识信息。由于该数据结构不仅是数据库中数据的组织形式,同时该数据结构还用于管理内存,也就是说在本实施例中不需要专门设立哈希表对内存进行管理。另外,在本实施例中,当子节点对应的数据页已经缓存在内存时,可以在该子节点的父节点中记录该子节点对应的数据页在内存中的存储地址。如此,当某个线程需要访问内存中某个子节点对应的数据页时,只需对该子节点的父节点进行加锁即可,由于一个父节点下的子节点个数是有限的几个子节点,因此,对一个父节点进行加锁,只是避免其他线程对内存中该有限个子节点对应的数据页进行访问,不会导致其他线程无法对内存中所有的数据页或大部分的数据页进行访问,从而在内存粒度上实现了无锁化,由于只是在数据页的粒度上加锁,因此大大减小了加锁的数据粒度,从而在高并发场景下,避免内存访问成为性能瓶颈,保证了数据库的吞吐量,从而有效提高了计算机系统性能。
在上述实施例的基础上,对所述第二节点加锁,包括:对所述第二节点包括的所述第一数据页在内存中的存储地址加锁。
如图4所示,当某个线程需要对节点7对应的数据页进行访问时,该线程可以只对节点3中的部分内容加锁。
例如,节点3包括Child_pointer_page7、Child_pointer_page8和Child_pointer_page9,因此,在对节点3进行加锁时,可以只对Child_pointer_page7、Child_pointer_page8和Child_pointer_page9加锁,或者只对Child_pointer_page7加锁。
本实施例通过对第二节点包括的第一数据页在内存中的存储地址加锁,可以进一步减小加锁的数据粒度,从而进一步提高了计算机性能。
可选的,对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括如下几种可能的情况:
一种可能的情况是:对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,删除所述内存中存储的所述第一数据页或删除所述第一数据页中的部分记录后,释放所述第二节点上的互斥锁。
例如,某个线程需要对内存中节点7对应的数据页进行删除操作或需要对内存中节点7对应的数据页中的部分记录进行删除操作时,该删除操作的实现过程如下所述:
1)对节点3加互斥锁。
2)根据节点7对应的数据页在内存中的存储地址,在内存中找到节点7对应的数据页,删除该节点7对应的数据页或删除节点7对应的数据页中的部分记录。如果是删除该节点7对应的数据页,进一步还需要删除节点3中的Child_pointer_page7,或者将节点3中的Child_pointer_page7赋值为NULL。
3)释放节点3上的互斥锁。
可以理解的是,节点3是非叶子节点(no-leaf node)、节点7是叶子节点(leafnode),由于节点3和节点7是相互关联的,因此,节点7和节点3是相互关联的叶子节点和非叶子节点。由于从非叶子节点可以查询到叶子节点。因此,在内存中,非叶子节点对应的数据页的访问频率要比叶子节点对应的数据页的访问频率高。因此,在对内存中的数据页进行删除时,可以优先删除叶子节点对应的数据页。
可选的,若删除所述内存中存储的所述第一数据页,则释放所述第二节点上的互斥锁之后,所述方法还包括:删除所述第一节点包括的所述第二节点对应的第二数据页在内存中的存储地址。
例如,某线程将内存中的节点7对应的数据页删除后,该线程还可以进一步删除该节点7包括的节点3对应的数据页在内存中的存储地址即Father_pointer_page3,或者将Father_pointer_page3赋值为NULL。该过程具体如下所述:
1)对节点7加互斥锁。
2)删除节点7中包括的节点3对应的数据页在内存中的存储地址即Father_pointer_page3。
3)释放节点7上的互斥锁。
可以理解的是,由于节点对应的数据页是缓存在内存中的,因此,当某个节点对应的数据页被删除时,并不意味着这个节点从数据结构中被删除,而只是从该节点的父节点中删除该节点对应的数据页在内存中的存储地址,以及删除该节点包括的该父节点对应的数据页在内存中的存储地址。该节点和其父节点之间的父子关系在该数据结构中还是存在的。
再一种可能的情况是:对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:对所述第二节点加共享锁,并根据所述第一数据页在内存中的存储地址,从所述内存中读取所述第一数据页或读取所述第一数据页中的部分记录后,释放所述第二节点上的共享锁。
例如,某个线程需要读取内存中节点7对应的数据页或该数据页中的部分记录,该读取操作的实现过程如下所述:
1)对节点3加共享锁。
2)根据节点3中的Child_pointer_page7,从内存中读取节点7对应的数据页或从内存中读取该数据页中的部分记录。
3)释放节点3上的共享锁。
又一种可能的情况是:对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页中的部分记录或全部记录进行修改后,释放所述第二节点上的互斥锁。
例如,某个线程需要修改内存中节点7对应的数据页或该数据页中的部分记录,该修改操作的实现过程如下所述:
1)对节点3加互斥锁。
2)根据节点3中的Child_pointer_page7,在内存中找到节点7对应的数据页,对该节点7对应的数据页中的全部记录或部分记录进行修改。
3)释放节点3上的互斥锁。
另一种可能的情况是:对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,在所述内存中存储的所述第一数据页中写入新的记录后,释放所述第二节点上的互斥锁。
例如,某个线程需要在内存中节点7对应的数据页中写入新的记录,该写入新记录操作的实现过程如下所述:
1)对节点3加互斥锁。
2)根据节点3中的Child_pointer_page7,在内存中找到节点7对应的数据页,在该节点7对应的数据页中写入新的记录。
3)释放节点3上的互斥锁。
本实施例通过对父节点加锁,根据父节点中记录的子节点的数据页在内存中的存储地址,对该数据页进行访问,例如,读取该数据页中的全部记录或部分记录、删除该数据页中的全部记录或部分记录、修改该数据页中的全部记录或部分记录、在该数据页中写入新的记录等操作,相应的访问操作完成后再释放父节点上的锁。相比于给哈希表加锁而锁定整个内存的方式,本实施例给父节点加锁的方式大大减小了加锁的数据粒度,从而在高并发场景下,避免内存访问成为性能瓶颈,保证了数据库的吞吐量,从而有效提高了计算机系统性能。
可选的,所述方法还包括:若所述第二节点不包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加互斥锁,将所述第一节点对应的第一数据页缓存到所述内存后,在所述第二节点中写入所述第一数据页在内存中的存储地址,并释放所述第二节点上的互斥锁。
如图4所示,目标数据的主键值为29,根据目标数据的主键值29从B+Tree的根节点对B+Tree进行遍历后,确定出节点7和节点3,节点7记为第一节点,节点3记为第二节点。但是,节点3中包括Child_pointer_page8和Child_pointer_page9,并不包括Child_pointer_page7,说明节点7对应的数据页并不在内存中,此时需要从磁盘中读取节点7占用的磁盘块7中的内容,并将该内容放入内存中新建的一个数据页中,即需要在内存中插入一个新的数据页,该数据页中的内容是节点7占用的磁盘块7中的内容。该插入操作的实现过程如下所述:
1)对节点3加互斥锁。
2)在内存中插入一个新的数据页,该数据页中的内容是节点7占用的磁盘块7中的内容。内存中新插入的数据页即为节点7对应的数据页。在节点3中增加节点7对应的数据页在内存中的存储地址,即在节点3中增加Child_pointer_page7。
3)释放节点3上的互斥锁。
可选的,释放所述第二节点上的互斥锁之后,所述方法还包括:在所述第一节点中写入所述第二节点对应的第二数据页在内存中的存储地址。
例如,在节点3中增加Child_pointer_page7后,还可以进一步在节点7中增加Father_pointer_page3。具体实现过程如下所述:
1)对节点3加互斥锁。
2)在内存中插入一个新的数据页,该数据页中的内容是节点7占用的磁盘块7中的内容。内存中新插入的数据页即为节点7对应的数据页。在节点3中增加节点7对应的数据页在内存中的存储地址,即在节点3中增加Child_pointer_page7。
3)释放节点3上的互斥锁。
4)对节点7加互斥锁。
5)在节点7中增加Father_pointer_page3。
6)释放节点7上的互斥锁。
本实施例通过在父节点中增加子节点对应的数据页在内存中的存储地址,在子节点中增加父节点对应的数据页在内存中的存储地址,可以实现对B+Tree的快速遍历,从而实现对内存中数据页的快速访问。
图5为本公开实施例提供的数据访问装置的结构示意图。本公开实施例提供的数据访问装置可以执行数据访问方法实施例提供的处理流程,如图5所示,数据访问装置50包括:
获取模块51,用于获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息;
遍历模块52,用于根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历;
确定模块53,用于确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息;
访问模块54,用于若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
可选的,若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则所述第一节点还包括所述第二节点对应的第二数据页在内存中的存储地址。
可选的,所述数据结构为树状的数据结构;遍历模块52具体用于:从根节点开始对数据库对应的数据结构进行遍历。
可选的,访问模块54具体用于:对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,删除所述内存中存储的所述第一数据页或删除所述第一数据页中的部分记录后,释放所述第二节点上的互斥锁。
可选的,访问模块54在删除所述内存中存储的所述第一数据页,释放所述第二节点上的互斥锁之后,还用于:删除所述第一节点包括的所述第二节点对应的第二数据页在内存中的存储地址。
可选的,访问模块54具体用于:
对所述第二节点加共享锁,并根据所述第一数据页在内存中的存储地址,从所述内存中读取所述第一数据页或读取所述第一数据页中的部分记录后,释放所述第二节点上的共享锁。
可选的,访问模块54具体用于:
对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页中的部分记录或全部记录进行修改后,释放所述第二节点上的互斥锁。
可选的,访问模块54具体用于:
对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,在所述内存中存储的所述第一数据页中写入新的记录后,释放所述第二节点上的互斥锁。
可选的,访问模块54对所述第二节点加锁时,具体用于:对所述第二节点包括的所述第一数据页在内存中的存储地址加锁。
可选的,访问模块54还用于:若所述第二节点不包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加互斥锁,将所述第一节点对应的第一数据页缓存到所述内存后,在所述第二节点中写入所述第一数据页在内存中的存储地址,并释放所述第二节点上的互斥锁。
可选的,访问模块54释放所述第二节点上的互斥锁之后,还用于:在所述第一节点中写入所述第二节点对应的第二数据页在内存中的存储地址。
图5所示实施例的数据访问装置可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
图6为本公开实施例提供的数据访问设备的结构示意图。本公开实施例提供的数据访问设备可以执行数据访问方法实施例提供的处理流程,如图6所示,数据访问设备60包括:存储器61、处理器62、计算机程序和通讯接口63;其中,计算机程序存储在存储器61中,并被配置为由处理器62执行如上所述的数据访问方法。
另外,本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行以实现上述实施例所述的数据访问方法。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (14)
1.一种数据访问方法,其特征在于,所述方法包括:
获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息;
根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历,确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息;
若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
2.根据权利要求1所述的方法,其特征在于,若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则所述第一节点还包括所述第二节点对应的第二数据页在内存中的存储地址。
3.根据权利要求1或2所述的方法,其特征在于,所述数据结构为树状的数据结构;
所述对数据库对应的数据结构进行遍历,包括:
从根节点开始对数据库对应的数据结构进行遍历。
4.根据权利要求1或2所述的方法,其特征在于,对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:
对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,删除所述内存中存储的所述第一数据页或删除所述第一数据页中的部分记录后,释放所述第二节点上的互斥锁。
5.根据权利要求4所述的方法,其特征在于,若删除所述内存中存储的所述第一数据页,则释放所述第二节点上的互斥锁之后,所述方法还包括:
删除所述第一节点包括的所述第二节点对应的第二数据页在内存中的存储地址。
6.根据权利要求1或2所述的方法,其特征在于,对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:
对所述第二节点加共享锁,并根据所述第一数据页在内存中的存储地址,从所述内存中读取所述第一数据页或读取所述第一数据页中的部分记录后,释放所述第二节点上的共享锁。
7.根据权利要求1或2所述的方法,其特征在于,对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:
对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页中的部分记录或全部记录进行修改后,释放所述第二节点上的互斥锁。
8.根据权利要求1或2所述的方法,其特征在于,对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁,包括:
对所述第二节点加互斥锁,并根据所述第一数据页在内存中的存储地址,在所述内存中存储的所述第一数据页中写入新的记录后,释放所述第二节点上的互斥锁。
9.根据权利要求1所述的方法,其特征在于,对所述第二节点加锁,包括:
对所述第二节点包括的所述第一数据页在内存中的存储地址加锁。
10.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述第二节点不包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加互斥锁,将所述第一节点对应的第一数据页缓存到所述内存后,在所述第二节点中写入所述第一数据页在内存中的存储地址,并释放所述第二节点上的互斥锁。
11.根据权利要求10所述的方法,其特征在于,释放所述第二节点上的互斥锁之后,所述方法还包括:
在所述第一节点中写入所述第二节点对应的第二数据页在内存中的存储地址。
12.一种数据访问装置,其特征在于,包括:
获取模块,用于获取数据访问请求,所述数据访问请求包括待访问的目标数据的标识信息;
遍历模块,用于根据待访问的目标数据的标识信息,对数据库对应的数据结构进行遍历;
确定模块,用于确定所述数据结构中的第一节点和第二节点,其中,所述第一节点是所述第二节点的子节点,所述第一节点包括所述目标数据的标识信息;
访问模块,用于若所述第二节点包括所述第一节点对应的第一数据页在内存中的存储地址,则对所述第二节点加锁,并根据所述第一数据页在内存中的存储地址,对所述内存中存储的所述第一数据页进行访问后,释放所述第二节点上的锁。
13.一种数据访问设备,其特征在于,包括:
存储器;
处理器;以及
计算机程序;
其中,所述计算机程序存储在所述存储器中,并被配置为由所述处理器执行以实现如权利要求1-11中任一所述的方法。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-11中任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011049612.1A CN114328500A (zh) | 2020-09-29 | 2020-09-29 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
PCT/CN2021/102471 WO2022068289A1 (zh) | 2020-09-29 | 2021-06-25 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011049612.1A CN114328500A (zh) | 2020-09-29 | 2020-09-29 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114328500A true CN114328500A (zh) | 2022-04-12 |
Family
ID=80949691
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011049612.1A Pending CN114328500A (zh) | 2020-09-29 | 2020-09-29 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN114328500A (zh) |
WO (1) | WO2022068289A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117668010A (zh) * | 2022-08-31 | 2024-03-08 | 中兴通讯股份有限公司 | 任务处理方法、电子设备以及存储介质 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP5339507B2 (ja) * | 2008-10-01 | 2013-11-13 | インターナショナル・ビジネス・マシーンズ・コーポレーション | 木構造を探索する方法 |
US8606979B2 (en) * | 2010-03-29 | 2013-12-10 | International Business Machines Corporation | Distributed administration of a lock for an operational group of compute nodes in a hierarchical tree structured network |
CN103780490B (zh) * | 2012-10-17 | 2018-03-30 | 中兴通讯股份有限公司 | 一种更新路由查找树的方法及装置 |
US9208258B2 (en) * | 2013-04-11 | 2015-12-08 | Apple Inc. | Locking and traversal methods for ordered tree data structures |
JP6912724B2 (ja) * | 2017-11-29 | 2021-08-04 | 富士通株式会社 | 情報処理プログラム、情報処理装置及び情報処理方法 |
US11836134B2 (en) * | 2018-03-20 | 2023-12-05 | Vmware, Inc. | Proactive splitting and merging of nodes in a Bε-tree |
CN109407979B (zh) * | 2018-09-27 | 2020-07-28 | 清华大学 | 多线程持久性b+树数据结构设计与实现方法 |
CN109582677B (zh) * | 2018-12-03 | 2021-05-04 | 东北大学 | 基于孩子节点的多粒度分布式读写锁的r树索引优化方法 |
CN110990404B (zh) * | 2019-11-27 | 2023-09-05 | 亚信科技(中国)有限公司 | 一种索引数据的处理方法、装置及电子设备 |
CN111198660A (zh) * | 2019-12-26 | 2020-05-26 | 天津中科曙光存储科技有限公司 | 一种b+树遍历的方法及装置 |
-
2020
- 2020-09-29 CN CN202011049612.1A patent/CN114328500A/zh active Pending
-
2021
- 2021-06-25 WO PCT/CN2021/102471 patent/WO2022068289A1/zh active Application Filing
Also Published As
Publication number | Publication date |
---|---|
WO2022068289A1 (zh) | 2022-04-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9256607B2 (en) | Efficient file access in a large repository using a two-level cache | |
US10127260B2 (en) | In-memory database system providing lockless read and write operations for OLAP and OLTP transactions | |
US10552402B2 (en) | Database lockless index for accessing multi-version concurrency control data | |
US9454560B2 (en) | Cache-conscious concurrency control scheme for database systems | |
US9037557B2 (en) | Optimistic, version number based concurrency control for index structures with atomic, non-versioned pointer updates | |
US9336258B2 (en) | Reducing database locking contention using multi-version data record concurrency control | |
US7376674B2 (en) | Storage of multiple pre-modification short duration copies of database information in short term memory | |
US9268804B2 (en) | Managing a multi-version database | |
US8666981B2 (en) | Bottom-up optimistic latching method for index trees | |
US20050033720A1 (en) | Database management system with efficient version control | |
US8954407B2 (en) | System and method for partially deferred index maintenance | |
US10509916B2 (en) | Access control lists for high-performance naming service | |
EP1934700A2 (en) | Database heap management system with variable page size and fixed instruction set address resolution | |
EP2336901B1 (en) | Online access to database snapshots | |
US8095731B2 (en) | Mutable object caching | |
CN110520845B (zh) | 更新硬件事务内存(htm)用户异常中止元数据的方法及系统 | |
Yeon et al. | Jellyfish: A fast skip list with mvcc | |
CN114328500A (zh) | 一种数据访问方法、装置、设备及计算机可读存储介质 | |
US6571250B1 (en) | Method and system for processing queries in a data processing system using index | |
CN110546609A (zh) | 硬件事务内存(htm)辅助数据库事务 | |
US8001084B2 (en) | Memory allocator for optimistic data access | |
CN115495462A (zh) | 批量数据更新方法、装置、电子设备和可读存储介质 | |
JP2004505380A (ja) | ネスト化データベースを実行するための方法、システム及びデータ構造 | |
US10698877B2 (en) | High-performance naming service using an optimistic-concurrency-control in-memory database | |
US20240160617A1 (en) | Garbage collection based on metadata indicating unmodified objects |
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 |