Java双索引技术 双向索引_Java双索引技术


一、数据库数据的存储结构

在谈及数据库的索引结构和理解数据库库索引为什么能提高数据查询性能,数据库索引为什么会导致插入数据变的复杂和消耗空间问题上,必须先了解数据的存储结构。

1.1、数据存储的结构

数据库中每行数据是按页式存储的,其一个数据页存储的数据可以包含多行数据,其每行数据之间通过指针进行相连接。对于一张表来说数据较大,其页有很多,每个数据页之间通过next、pre指针进行链接,形成双向的链表。

1.2、数据库表未添加索引进行查询的过程和效率低的原因

数据库表未添加索引,其从数据存储结构上进行分析,可以知道。其每个页的存储结构都会有一个以主键的页表,用于通过主键进行页查询,快速定位到指定页的位置,取出对应的数据内容。如果其查询条件不是主键的话,其页表将无法取到作用,因此,只能从双链表的头节点开始变量双向链表,并且页中也是通过遍历单链表的形式进行数据查询,直到找到数据为止。该过程消耗大量的时间,虽然用主键页表方式进行查询,因为也需要遍历双向链表,所以也很消耗时间。

二、数据库索引的类型

数据库索引在mysql中,其索引类型主要包括哈希索引和B+树索引。在哦乐扣数据库中,其支持B树索引结构。

2.1、数据库B+树索引结构

非聚组索引结构:数据库索引存储结构也是页式存储,其B+树叶子节点上的数据中存储多个数据页,各个数据页之间通过双向链表进行链接。其每页数据中,包括多个数据项,数据项中也是通过链表的形式形成一个单向链表。该单向链表以索引列的数值大小进行排序,每个数据页之间也是通过索引列数值进行排序的,所以索引将无序存储的数据进行相对有序化存储。

数据项的结构:对于非聚组索引数据项的数据包括:该行数据索引列的数值、主键id(需要进行回表查询,这里有回表查询概念)。

会问什么是回表查询
在mysql的InnoDB存储引擎中,对于每张表mysql都会自动为其添加以主键id的聚组索引,

目录项的概念:目录项就是一个结构体,该结构体中数据记录一下其所指的节点的索引最小值、其数据所指目录项存储的页号(即指针)。

2.2、数据库B+树索引创建的过程

其根据数据行所指的列为索引,他会根据其索引列的大小进行