数据库性能优化必读,AntDB-M数据库的哈希索引设计

news2024/10/3 6:33:41

数据库加快访问速度的关键技术之一就是索引,索引的设计及使用方式极大程度上影响了数据库的性能。AntDB-M支持Hash、BTree两种索引类型。本文主要讲解Hash索引的相关设计,并给出一些使用建议。

1. 相关概念

  • 用于定位索引记录的容器,容器中的每个元素记录的是表记录的唯一编号,元素为空说明当前索引位置没有表记录。

  • 桶大小

    一个桶中可以直接存储的记录唯一编号个数。

  • 桶下标

    桶下标由索引列经过Hash计算后得到的Hash值与桶大小取模得到。

  • 索引记录链表

    由于Hash冲突的存在,不同表记录经过Hash计算得到的桶下标可能相同,对于相同桶下标的索引记录都存放在一个双向链表中,即索引记录链表,桶上元素的就是索引记录链表头。

2. 内存结构

AntDB-M的Hash索引内存结构设计非常简洁、高效。每个Hash索引都有两部分组成:桶、索引记录链表。

  • 桶为一个一维数组,数组中的每个元素都是表记录的唯一编号,索引记录的唯一编号与表记录唯一编号相同。

图1:桶

  • 索引记录链表

    AntDB-M索引记录链表用于记录具有相同hash值的索引记录。内存结构是一个三层结构:1)一级地址;2)二级地址;3)链表节点;该结构的组织形式与表数据的组织形式类似(参考“AntDB-M 设计之内存结构”),可以通过记录的唯一编号快速定位到链表中的记录。 

    索引记录链表的节点有三部分组成:前一个记录编号、后一个记录编号、事务(仅唯一索引有)。桶中记录的记录编号为链表头结点的记录编号。

图2:索引记录链表

由上文可以看出Hash索引整个结构中仅仅涉及记录编号与事务信息,结构非常轻便,按需扩展内存,不会占用过高的内存。

3. 索引处理

3.1 持久化

AntDB-M索引包括两部分数据:索引元数据、索引记录。在做数据的持久化时,只会对索引元数据做持久化。

3.2 初始化

在AntDB-M数据库服务启动时,首先加载表数据记录,然后加载索引元数据,最后根据索引元数据在内存中初始化索引记录。

3.3 插入索引记录

表插入一条记录时,会先插入表记录,再插入索引记录。新的记录会添加到索引链表头部,以提高插入速度。

  • 普通索引

图3:普通索引插入

对于普通索引,因为不需要判断记录的唯一性,所以并发插入不会相互影响,可以直接插入。新插入的索引记录是立即生效的,即其他事务查询时可以立即访问,但是表记录的可见性由表记录上的事务信息以及锁来控制。在事务提交时,普通索引不需要再做任何处理。事务回滚时,将索引记录本身从索引记录链表中删除。

  • 唯一索引

图4:唯一索引插入

对于唯一索引,需要检测是否存在唯一键冲突。当相同桶下标的索引记录链表中已经存在相同记录,并且事务还未提交(索引记录上事务字段有值),则阻塞等待其他事务提交或者回滚,以检测唯一键冲突。事务提交,则清除索引记录上事务信息。事务回滚,则删除索引记录。事务提交、回滚都会通知正在阻塞等待的事务。

3.4 索引查询

按哈希索引查询时,先根据索引列计算出的哈希值对哈希桶大小取模,获取桶下标,然后获取遍历该下标下的索引记录列表,获取匹配记录的记录编号,将编号放入为当前事务分配的查询上下文中,供后续查询遍历使用。索引记录与数据记录拥有相同的记录编号,根据记录编号可以立即定位到数据记录。整个过程主要开销是哈希值的计算与索引记录项的比较,性能非常高。

3.5 删除索引记录

图5:普通索引删除

图6:唯一索引删除

表删除一条记录时,先删除表数据记录(标记删除标识,更新事务信息),然后更新唯一索引记录上的事务为当前事务。由于普通索引并没有事务信息,因此不会做任何操作。更新索引记录上的事务是为了数据记录唯一性在多事务并发时的冲突检测。因为当前事务已经获取了记录上的互斥锁,所以更新索引记录不会影响索引记录的一致性,可以直接更新。

事务提交时,索引记录并不立即删除,在查找时通过索引还是会找到索引记录。表记录的的可见性仍然有表记录上的事务信息、锁信息来控制(即MVCC)。后续会有单独的清理线程在数据记录没有事务再访问时,会对数据记录和索引记录进行实际删除。

事务回滚时,只需要对唯一索引清除索引记录上的事务信息。

如果是唯一索引,事务提交、回滚都会通知正在阻塞等待的事务。

3.6 更新索引项

表记录的更新,只有涉及到索引列更新时,才会更新索引。涉及索引更新时,表记录的修改会转换为先删除旧记录,后插入新记录的方式。对于索引的操作也同样转换为上文的插入索引项、删除索引项。事务的提交、回滚也同上文的插入索引项、删除索引项。

3.7 节点链表扩展

索引节点链表空间大小(记录个数)与表记录空间大小保持一致。当表中新记录超出表空间大小,需要对表空间扩展时,同时对索引节点链表进行扩展。

3.8 桶重建(rehash)

在创建索引时,索引桶大小初始值可以由索引属性block_size来指定,未指定则以表当前记录数为准,最小值为100000。定时检测(默认5分钟,可配置)表记录数是否超过桶的大小,超过了便对桶进行扩展,并重建Hash索引。

  • 新桶大小

新桶大小为比当前桶大小大的最小素数。

  • 桶访问锁

对于每个线程,在初次访问索引时都会分配一个桶访问节点,该节点上设置了当前的桶地址,以及一把互斥锁。在线程开始访问索引时,先申请访问节点上的锁,访问结束释放锁。通过该锁确保索引访问过程中,桶资源不会因为rehash被释放。

  • 异步重建

桶重建是一个异步过程,重建桶过程中,并不影响索引的查询以及更新。该过程通过记录当前迁移位置来影响访问旧桶,还是新桶。当数据迁移完毕,并且没有对旧桶的访问时(没有线程持有该桶的桶访问锁),对旧桶资源进行释放。

3.9 索引与锁

为了避免过多的锁占用系统过多资源,以及保持较高的并发度,AntDB-M数据库的每个Hash索引都分配有131个锁,通过桶下标与131取模来获取当前索引记录的锁。在访问索引(查询或者修改)过程中都会先加锁。

4. 索引特性

4.1 前缀索引

前缀索引是指适用指定列,或者指定列的指定前缀长度做为索引。

这种特性适用于以下两种情况:

1. 索引列数据过长

2. 索引列部分的数据,适用于特定业务查询的场景。

AntDB-M还可以指定每列的前缀长度,而不仅仅是最后一列的前缀长度,这就为业务提供了非常灵活的索引能力,方便客户实现更高效、响应速度更快的业务落地。

4.2 数据分布

对于每个Hash索引,都会统计当前位置下Hash值相同记录个数。

该统计值,主要用来判断当前数据是否存在较大的Hash冲突。便于AntDB-M的运维管理人员快速定位,是否适合建立Hash索引,是否需要进一步优化Hash索引。

5. 限制约束

5.1 不支持范围查询

对于Hash索引,由于索引记录本身不排序,因此不支持范围查询。

注意:对索引列字段的范围查询,都会进行全表遍历。

5.2 不支持模糊查询

AntDB-M支持固定长度的左前缀匹配。但由于Hash计算本身需要精确值,因此不支持模糊匹配。

5.3 索引列不应有太多相同值

如果有较多的列有相同值,这些记录将位于同一个索引记录链表中,每次查询都将遍历该列表所有记录进行筛选,数据越多,性能越低。

6. 总结

正是Hash索引这种简洁的设计,让AntDB-M数据库能够以较少的内存和计算,即可提供高效的索引能力,在提升数据库的访问性能的同时,大幅降低了系统资源的开销。但Hash索引算法也存在一些使用上的限制,主要是由于其本身的特性,了解这些特性,可以帮助业务模型设计人员选择合适的索引类型,以最大化提升数据库的性能。

关于AntDB数据库

AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python学习——列表

一、列表介绍 可以将列表视作一个容器,里面可以存储多个元素。这些元素可以是不同的数据类型。 二、列表的操作 2.1.列表的创建 方式一:使用中括号[]进行列表的创建,元素之间使用英文的逗号隔开。例如 在上图中,lst1是列表对象名…

Ant Design Vue - table实现跨页选择

实现下图跨页选择效果 :rowSelection"{ onSelect: onSelect, onSelectAll: onSelectAll, selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"onSelectChange(selectedRowKeys, selectionRows) {console.log(select, this.selectedRowKeys, this.selecte…

ActiveMQ消息队列主从集群

文章目录 1.ActiveMQ消息队列主从集群模式1.1.主从集群架构1.2.环境规划 2.部署ActiveMQ主从高可用集群2.1.部署Zookeeper集群2.1.1.搭建Zookeeper三节点2.1.2.配置Zookeeper三节点2.1.3.配置Zookeeper各个节点的myid2.1.4.启动Zookeeper集群 2.2.部署ActiveMQ主从集群2.2.1.部…

解决90%面试问题!GitHub顶级“Java面试手册“了解下八股文天花板

前言 身为java开发工程师的你找到自己满意的工作了吗?又或者还在面试的路上经历一次又一次的失败。迟迟找不到正确的开门砖,也许你的技术能力可能并不差但就是在面试上得不到充分的证明。 而那些成功拿下自己满意的开发工作的人又是怎样做到的呢?我这一路走来也有…

2023下半年杭州/广州/深圳软考(中/高级)认证,进入备考

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

Svg基本使用

1.说明 双闭合标签&#xff0c;默认宽度和高度300*150 svg绘制图形务必在svg标签内使用 ,可以通过样式设置宽高 svg与canvas区别就是它并不是图片 2.绘制直线 2.1代码展示 <linex1"100"y1"100"x2"500"y2"100"stroke"pink…

网络安全行业,面对供大于求的现状是怎么样的呢?

一、网络安全行业市场发展情况 网络时代生活越来越离不开网络&#xff0c;与此同时发生的网络安全攻击事件、非法入侵等等一系列事件都威胁着普通人的生活。没有网络安全保障&#xff0c;个人和企业等重要领域都暴露在风险之中。 二、网络安全行业人才发展需求 网络安全行业至…

【算法题】剪绳子、计算二进制中1的个数、数值的整数次方

剪绳子、计算二进制中1的个数、数值的整数次方 一、剪绳子1.1、题目描述1.2、思路1.3、代码实现&#xff1a;1.4、华丽的快速幂取余1.5、小结 二、数值的整数次方2.1、题目描述2.2、思路2.3、代码实现2.4、小结 三、计算二进制中1的个数3.1、题目描述3.2、思路3.3、代码实现3.4…

Kafka最基础使用

一、概念 2、应用场景 异步处理系统解耦流量削峰日志处理 3、消息队列的两种模式 点对点模式 消息发送者生产消息发送到消息队列中&#xff0c;然后消息接收者从消息队列中取出并且消费消息。消息被消费以后&#xff0c;消息队列中不再有存储&#xff0c;所以消息接收者不可…

(一)CSharp-网络编程

一、OSI 参考模型 &#xff08;1&#xff09;物理层 作为原始的位流或电气处理。 &#xff08;2&#xff09;数据链路层 负责建立、维持和释放数据链路的连接。 &#xff08;3&#xff09;网络层 选择合适的网间路由和交换结点&#xff0c;以确保数据及时传送。网络层将数据…

Flutter性能优化的一些路径思考

不可否认 Flutter 是一个非常强大的移动应用开发框架&#xff0c;我们在技术架构选型时就是选用的 Flutter&#xff0c;特别是跨端能力属实很优秀&#xff0c;but 也逐渐发现在复杂的应用程序实现中&#xff0c;App 的性能会受到一些影响。 其实这个问题&#xff0c;我们内部…

如何用Dialog DA1468X DK PRO测试其他板子的电流

2021.09.27 Jim 目录 工具准备... 1 PC上位机安装... 1 打开PC上位机... 1 消除DA1468X开发板本身底电流... 2 测试待测板子的功耗... 3 电压调节... 4 跳线帽... 6 工具准备 DA1468X DK PRO开发板一套&#xff0c;不需要装顶板的小板子&#xff0c;只需要母板&#…

「缤纷色彩的饼状图」:通过使用matplotlib库绘制饼状图,让读者期待在这个色彩缤纷的图表中探索数据的美丽。

嘿&#xff0c;大家好&#xff01;今天我要带你们探索一个有趣的话题&#xff1a;使用matplotlib库绘制饼状图。虽然这听起来可能有些复杂&#xff0c;但我会用轻松幽默的语言给大家讲解&#xff01;准备好了吗&#xff1f;让我们开始吧&#xff01; 首先&#xff0c;我们需要导…

人工智能的奥秘:机器学习的各大门派

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。 文章分类在学习摘录和笔记专…

2023网络安全 -- 正向连接与反向连接

一、正向连接&#xff0c;Linux服务器主动控制windows服务器 1、上传nc到windows服务器上运行 2、以管理员身份运行cmd 3、执行下面命令&#xff0c;监听任意来自8899端口的数据&#xff0c;等待服务器来连接 nc -e cmd -lvvp 8899 4、Linux服务器执行如下命令&#xff0c;i…

解决USB设备PC不识别问题思路(亲测方案)

前言&#xff1a; 因环境是集控封锁USB端口的&#xff0c;所以刚碰到用户出现此问题&#xff0c;一般都认为是策略封堵拒绝了&#xff0c;但经过后面测试及权限查看是没问题的&#xff0c;所以深究一看&#xff0c;完全是USB设备都没有被PC主机识别的问题。按常规我们一般碰到这…

渗透怎么学?渗透测试中超全的提权思路来了!

提权Webshell&#xff1a;尽量能够获取webshell&#xff0c;如果获取不到webshell可以在有文件上传的地方上传反弹shell脚本&#xff1b;或者利用漏洞&#xff08;系统漏洞&#xff0c;服务器漏洞&#xff0c;第三方软件漏洞&#xff0c;数据库漏洞&#xff09;来获取shell。 …

webpack3 打包vue项目导致app体积过大

问题说明&#xff1a;打包导致 js 很大&#xff0c;然后访问特别慢。 Q&#xff1a;如果你的 js 达到了好几M&#xff0c;&#xff08;除了个别情况&#xff0c;比如的代码量真的超级大到不行&#xff0c;其实这个本身就不成立&#xff09;。我最开始就是&#xff0c;打包了我…

CSDN个性化推荐系统-负反馈测试

文章目录 前言一、uc不感兴趣标签过滤测试1.uc不感兴趣标签获取(uc_unlike_tag_list)1.1个人中心界面1.2从标签中可以发现什么&#xff1f;1.3与研发确认点1.4设计开发1.5接口获取结果 2.推荐流文章标签获取(tag_list)2.1部分代码2.2基本标签校验2.3基本标签校验结果 3.推荐流u…

Linux——DNS域名解析服务

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。 个人主页&#xff1a;小李会科技的…