Page 83 - 《软件学报》2021年第5期
P. 83
尤勇 等:一种监控系统的链路跟踪型日志数据的存储设计 1307
Fig.2 Structure of hash indexing
图 2 Hash 索引结构
在创建 hash 索引时,首先使用哈希函数对 LogView 的 id 值计算得到哈希值,再对哈希值与数组容量大小进
行位运算,得到的值即为它在数组空间中的下标位置;之后新建一个节点,并将 id 值、地址信息记录到节点中;
最后,将节点添加到链表尾部即可.
在使用 hash 索引查询 LogView 时,利用 id 值查询,起始同样是计算哈希值、位运算定位下标两个步骤,下
标定位过程的时间复杂度为 O(1),这也是 hash 索引的性能突出优势.在获取到下标值之后,即可找到对应的链
表,最后对链表进行遍历并一一比对.
hash 索引存在以下优缺点.
• 优点:索引的设计简捷、高效;使用 hash 函数定位数组空间的下标时,时间复杂度为 O(1).
• 缺点:(1) 查询效率不稳定,部分查询效率非常快,而部分则非常慢.这是因为 hash 索引结构中的链表部
分的长度并不平均.如图 2 所示,图中的 4 条链表中的节点数目差距较大,所以在链表的遍历时所用的
时间也不一致.所以,一个合适的哈希函数能够让 LogView 在哈希表中的分布更加均匀(即数组中不存
在空洞、链表长度较平均),而这个函数的选择是比较困难的.(2) 在索引结构的数组部分存在较多的空
洞,如图 2 所示,数组中较多的空间并没有用到,即较多的内存空间内浪费了.(3) 针对数组部分的 hash
函数难以找到合适的,此外,数组大小的初始化值同样不好定义,并且在数组空间满了之后,需要对数组
空间进行扩容操作,实现上同样相对麻烦.最后,在链表的节点中,需要记录的信息较多,除了地址信息
外,还需要额外将 id 值记录下来,这样在遍历链表时才能进行一一对比确定是否为指定的 LogView.
2.2.2 B+树索引
B+树 [22] 是当前主流数据库存储引擎(比如 Innodb)中常用的索引结构.在构建 B+树时,需要不断添加树节点
以及调整树的结构;而在查询时,则直接根据树节点数据定位到根节点,获取到根节点中存储的地址信息即可.
如图 3 所,B+树索引通常在 2~4 层,所以磁盘的 IO 次数也在 2~4 次,查询性能很高.
Fig.3 Indexing structure of B+ tree
图 3 B+树索引结构
在使用 B+树的构建索引结构时,同样需要针对 id 值建立索引树,B+树索引结构存在以下优缺点.
• 优点:B+树索引的查询性能稳定且高效;不同于 hash 索引需要预定义较大的内存空间并且可能会发生