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

2023-10-29

数据库加快访问速度的关键技术之一就是索引,索引的设计及使用方式极大程度上影响了数据库的性能。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亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 猫头虎博主的MySQL救援指南:轻松解决初始化问题(nysqld: Can create directort :mysgl mysg! 9-winx64 data errno such file o)

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • mysql+关掉密码过期

    mysql 关掉密码过期 要在MySQL中关闭密码过期功能 可以按照以下步骤进行操作 登录到MySQL服务器 使用管理员账户 如root 连接到数据库 mysql uroot ppassword 运行以下命令来查看当前的密码过期设置 SHO
  • MySQL中设置自增主键id从1开始

    可能遇到过这种问题 当你只想新增一条数据时 发现使用Insert语句后 发现id并不是从1开始的 握草 怎么回事 其实很简单 通过执行一下SQL 对应你的表就可以解决 ALTER TABLE user AUTO INCREMENT 1 具体
  • 【计算机开题报告】 医药信息管理系统

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 1 研究背景 随着医药事业的不断壮大 相关单位对于医药信息的管理变得越来越重要 传统的手工管理效率低 易出错 费时费力 不能及时精确的收集 传递 存储 加
  • 如何在CentOS安装SQL Server数据库并通过内网穿透工具实现公网访问

    文章目录 前言 1 安装sql server 2 局域网测试连接 3 安装cpolar内网穿透 4 将sqlserver映射到公网 5 公网远程连接 6 固定连接公网地址 7 使用固定公网地址连接 前言 简单几步实现在Linux cento
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承
  • Kali Linux 安全渗透核心总结,444页核心知识点

    就像IT人离不开Linux系统一样 网安人也离不开Kali Linux 作为攻击性防御和渗透测试的代名词 越来越多的人开始学习Kali 如果你也对kali感兴趣 又想深入了解这方面内容 不妨收藏一下这份Kali Linux安全渗透教程 共4
  • 天猫数据分析工具推荐(天猫第三方数据平台)

    在电商迅速发展的大背景下 做好天猫数据分析能够在多方面帮助品牌商家更好地运营店铺 塑造品牌 如通过数据分析了解消费者的需求 购买偏好 这有利于品牌商家及时调整商品结构 产品推广 商品宣传等等 灵活制定品牌的销售策略 那么 天猫平台行业 品牌
  • 进程间通信

    进程间通信 进程间通信介绍 进程间通信目的 数据传输 一个进程需要将它的数据发送给另一个进程 资源共享 多个进程之间共享同样的资源 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止 时要通知父进程
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • AntDB内存管理之内存上下文之如何使用内存上下文

    5 如何使用内存上下文 使用内存上下文之前 我们需要先对其进行创建 AntDB启动时已经创建并初始化好了部分内存上下文 例如 TopMemoryContext 这个TopMemoryContext是所有内存上下文的父节点或者祖先节点 一般我
  • 软件测试/测试开发/全日制/测试管理丨Redis内存数据库

    Redis是一种开源 内存中的数据结构存储系统 它提供了高性能 灵活性和丰富的数据结构 以下是Redis内存数据库的基本介绍 键值存储 Redis基于键值对的存储模型 其中每个键都与一个特定的值相关联 这种简单的数据模型使其易于使用和理解
  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明 2 文件读写 2 1 写数据 write 2 2 读数据 read 2 3 读数据 readlines 2
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具

随机推荐

  • 【React】 13课 安装react脚手架

    第一步 安装脚手架之前需要电脑已安装node与npm 首先按住 shift 鼠标右键 按下 在此处打开命令行窗口 进入命令行窗口 或者 win R 键 输入cmd 进入命令行窗口 输入 node v 与 npm v 查看有无安装node与n
  • Linux安装MySQL5.7.37

    下载地址 https dev mysql com downloads mysql 5 7 html downloads 点击download进入以下页面 可以找到下载链接地址 https dev mysql com get Download
  • python3 sha256加密用法

    hashlib模块简介 hashlib模块为不同的安全哈希 安全散列 Secure Hash Algorithm 和 信息摘要算法 Message Digest Algorithm 实现了一个公共的 通用的接口 也可以说是一个统一的入口 因
  • vue-router之addRoutes使用遇到的坑

    最近项目中使用了vue router的addRoutes这个api 遇到了一个小坑 记录总结一下 场景复现 做前端开发的同学 大多都遇到过这种需求 页面菜单根据用户权限动态生成 一个常见的解决方案是 前端初始化的时候 只挂载不需要权限路由
  • 解决Tomcat后台修改前端无变化问题

    在用tomcat8 9 eclipse ssm开发java web项目的时候 有时会发现后台代码修改了 而前端显示却没有变化 两种情况及解决方案如下 状况一 修改了JSP页面代码 但是浏览器显示出来的还是之前的页面 原因 服务器为提高响应速
  • 统计单词出现的最多次数(Trie树)

    A Time Limit 60ms Memory limit 65536K 有疑问 点这里 题目描述 给出n 1 lt n n lt 2 10 6 个字符串 每个字符串只包含小写英文字母 且最多有五个 问这n个字符串中出现次数最多的有多少个
  • 1.c++环境配置及第一个环境运行

    开发IDE与环境 最好是使用ubuntu系统进行开发 如果没有的话 基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以 开发的过程跟本地差不多 vs code IDE 插件的安装 1 变成中文菜单与提
  • ByteBridge数据标注平台:自动驾驶相关数据标注

    ByteBridge Dashboard是一个Saas型数据采集标注平台 利 强大的标注工具 运 智能算法技术 依靠交叉审核质检机制 借助标注运营及管理 动 体化系统 为客户按时提供安全 稳定 质量的数据标注服务 满 在模式识别领域进 科研
  • BP算法

    只限于自己看 预先说明 首先 这里面什么看成变量 什么看成常量 变量 网络的权值W 偏置b默认在W内 以及输入X 常量 就是target 你可能会说呃呃呃 不是输入都是有值吗 不都是数吗 怎么会是变量啊 一般来说网络的反向传播就是两种类型
  • VS2015--win32工程配置

    一个工程很大 需要很多的文件 如果都是我们自己写的文件 我们一般不会把实现不同功能的两个文件命以相同的名称 但是 如果我们引入了第三方库的源码 这样就很有可能有相同名字的文件存在 比如很多库都喜欢定义一个base h文件用于放置一些最基本的
  • Modbus RTU协议认识

    Modbus RTU协议认识 一 通信模式 Modbus RTU协议是一个主从协议 主机发出请求 从机返回响应 从机不能主动发送数据 同一时刻总线上只能有一个主机 但可以有多个从机 从机之间不能相互通信 二 通信角色 主机 主机没有编号 因
  • MYSQL修改时区

    按照公司要求 java程序和数据库时区保持在UTC时区 本文将针对自建数据库 提供修改时区方法 含盖windows和ubuntu环境 一 Windows环境 1 找到mysql配置文件 my ini mysql由于按照方式不同 存在位置可能
  • Python基础知识: for . in range()循环

    Python for x in range 循环打印四个数字能生成多少个互不相同且无重复数字的三位数 记录打印三位数的个数 count 0 用i控制第一位输出的位数 for i in range 1 5 用j控制第二位输出的位数 for j
  • (转)大厂的产品经理是怎样进行产品迭代的?

    先说一下背景 大厂和小厂都呆过 呆过野蛮生长的传统集团的互联网部门 呆过上市的中型二线互联网公司 呆过APPLE STORE行业APP排名第一的产品公司 现在呆在全球一万多员工的超级独角兽公司 其实各个产品公司的迭代流程都大同小异 因为规范
  • Flink 1.11.2 在K8s里基于NFS搭建高可用集群

    使用官方的docker镜像搭建job ha集群一直失败 最后参考了flink1 11 2 的start cluster sh 脚本 对docker 的启动脚本进行了调整 终于成功了 希望能够帮助到大家 需要注意的是 我的k8s环境是基于k8
  • GIS开发一:OpenLayers在线瓦片数据源汇总

    文章目录 1 概述 2 地图数据源 2 1 Google 2 2 OpenStreetMap 2 3 Thunderforest 2 4 Mapbox 2 5 ArcGIS 2 6 Bing地图 2 7 高德地图 2 8 百度地图 2 9
  • 自用入门人工智能笔记

    定义 百度百科的定义 机器学习的主要研究对象是人工智能 特别是如何在经验学习中改善具体算法的性能 能通过经验自动改进的计算机算法的研究 用数据和以往的经验来优化计算基础性的性能标准 Machine Learning书中的定义 如果一个程序可
  • Unity AssetBundle(2):工具UnityStudio

    一 UnityStudio 作用有两个 查看AssetBundle内资源 File gt LoadFile 提取AssetBundle内资源 Export 下载地址 UnityStudio releases地址 Perfare UnityS
  • Linux下Mysql 5.6.21 tar包安装实践

    好久没玩linux 由于项目需要部署新的linux开发环境 包括安装jdk tomcat redis mysql 趁着有时间 赶紧部署好 jdk tomcat redis很快就部署好了 唯独mysql让我折腾了一阵 先安装了我之前就安装过的
  • 数据库性能优化必读,AntDB-M数据库的哈希索引设计

    数据库加快访问速度的关键技术之一就是索引 索引的设计及使用方式极大程度上影响了数据库的性能 AntDB M支持Hash BTree两种索引类型 本文主要讲解Hash索引的相关设计 并给出一些使用建议 1 相关概念 桶 用于定位索引记录的容器