数据库之索引(三)

目录

一、简述索引实现的原理

二、简述数据库索引的重构过程

三、为什么MySQL的索引使用B+树

四、简述联合索引的存储结构及其有效方式

五、MySQL的Hash索引和B树索引有何区别


一、简述索引实现的原理

        在MySQL中,索引是在存储引擎层实现的,不同存储引擎对索引的实现方式是不同的,下面我们讨论一下MyISAM和InnoDB两个存储引擎的索引实现方式。

        1、MyISAM索引实现

        MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,MyISAM索引的原理图如下。这里假设表一共三列,假设我们以Col1为主键,则下图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

926b050c16dc4783b1df621bbe60f638.png

        如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示。同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

7b01c1a564684dd2a9072cee508be9af.png

        2、InnoDB索引实现

        虽然InnoDB也使用B+Tree作为索引结构,但是具体实现方式却与MyISAM不同。

        第一个重要区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键。因此,InnoDB表数据文件本身就是主索引。

        下图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显示指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

38bcec7e0384454688c9fb759126f3ae.png

        第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。下图为定义在Col3上的一个辅助索引。这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

b0f0deff4ed54efa946ce624d6de9778.png

        了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会使得辅助索引变得过大。再比如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新纪录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

二、简述数据库索引的重构过程

        1、什么时候需要重建索引?

        ①表上频繁发生update、delete操作;

        ②表上发生了alter table ..move操作(move操作导致了rowid变化)。

        2、如何判断索引是否应该重建?

        ①一般看索引是否倾斜的严重,是否浪费了空间,对索引进行结构分析;

analyze index index_name validate structure;

        ②在相同的session中查询index_stats表:

select height,DEL_LF_ROWS/LF_ROWS from index_stats;

        当查询的height>4(索引的深度,即从根到叶节点的高度)或DEL_LF_ROWS/LF_ROWS>0.2 的情况下,就应该考虑重建该索引。

        3、如何重建索引?

        ①drop原索引,然后再创建索引

drop index index_name;
create index index_name on table_name(index_column);

         这种方式相当耗时,一般不建议使用。

        ②直接重建索引

alter index indexname rebuild;
alter index indexname rebuild online;

        这种方法较快,建议使用。

        rebuild是快速重建索引的一种有效办法,因为它是一种使用现有索引项来重建新索引的方法。如果重建索引时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题。由于新旧索引在建立时同时存在,因此,使用这种重建方法需要有额外的磁盘空间可供临时使用,当索引建完后将旧索引删除,如果没有成功,也不好影响原来的索引。利用这种办法可以用来将一个索引移到新的表空间。

        rebuild重建索引的过程:

        ①Rebuild以index fast full scan或table full scan方式(采用哪种方式取决于cost)读取原索引中的数据来构建一个新的索引,重建过程中有排序操作,rebuild online 执行表扫描获取数据,重建过程中有排序的操作;

        ②Rebuild会阻塞DML操作,rebuild online不会阻塞DML操作;

        ③Rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都会记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。

        重建索引过程中的注意事项:

        ①执行rebuild操作时,需要检查表空间是否足够;

        ②虽然rebuild online操作允许DML操作,但还是建议在业务不繁忙时间段进行;

        ③rebuild操作时会产生大量的Redo log。

三、为什么MySQL的索引使用B+树

        B+树由B树和索引顺序访问方法演化而来,它是为磁盘或其它直接存取辅助设备设计的一种平衡查找树,在B+树中,所有记录节点都是按照键值的大小存放在同一层的叶子节点,各叶子节点通过指针进行链接。如下图:

799d59b57cf24937a0112aa557983e6c.png

        B+树索引在数据库中的一个特点就是高扇出性,例如在InnoDB存储引擎中,每个页的大小为16KB。在数据库中,B+树的高度一般都在2~4层,这意味着查找某一键值最多只需要2到4次IO操作,这还不错。因为现在一般的磁盘每秒至少可以做100次IO操作,2~4次的IO操作意味着查询时间只需要0.02~0.04秒。

四、简述联合索引的存储结构及其有效方式

        从本质上讲,联合索引还是一颗B+Tree,不同的是联合索引的键值数量不是1,而是大于等于2,参考下图。此外,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。所以使用联合索引时遵循最左前缀集合。

e4c0ec89d3094f1495646926949c7b1e.png

五、MySQL的Hash索引和B树索引有何区别

        Hash索引底层就是hash表,在进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+Tree底层实现是多路平衡查找树,对于每一次的查询都是从根节点出发,查找到叶节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。它们有以下的不同:

        1、Hash索引进行等值查询更快(一般情况下),但是无法进行范围查询。因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+Tree的所有节点遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。

        2、Hash索引不支持使用索引进行排序,原理同上。

        3、Hash索引不支持模糊查询以及多列索引的最左前缀匹配,原理也是因为hash函数的不可预测。

        4、Hash索引任何时候都避免不了回表查询数据,而B+Tree在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。

        5、Hash索引虽然在等值查询上较快,但是不稳定,性能不可预测,当某个键值存在大量重复的时候,会发生hash碰撞,此时效率可能极差。而B+Tree的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

        因此,在大多数情况下,直接选择B+Tree索引可以获得稳定且较好的查询速度,而不需要使用hash索引。

 

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

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

相关文章

Echarts:渲染成Canvas还是SVG,该如何抉择?

ECharts 从初始一直使用 Canvas 绘制图表。而 ECharts v4.0 发布了 SVG 渲染器,从而提供了一种新的选择。在初始化图表实例时,只需设置 renderer 参数 为 canvas 或 svg 即可指定渲染器,比较方便。贝格前端工场带领大家看下如何选择。 一、C…

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围

如何使用HTML和JavaScript读取文件夹中的所有图片并显示RGB范围 在这篇博客中&#xff0c;我将介绍如何使用HTML和JavaScript读取文件夹中的所有图片&#xff0c;并显示这些图片以及它们的RGB范围。这个项目使用现代浏览器提供的<input type"file" webkitdirecto…

苹果电脑为什么要清理软件?

你有没有想过&#xff0c;你的苹果电脑也许是一个秘密的收藏家&#xff1f;没错&#xff0c;你的Mac可能在悄悄收集那些你曾经用过的每一个字节&#xff0c;从那次偶然下载的应用到你已经忘记了的各种文件。久而久之&#xff0c;这些“收藏品”就会堆积成山&#xff0c;让你的苹…

智能电表在碳中和实现过程中发挥什么作用

智能电表在碳中和实现过程中发挥着至关重要的作用&#xff0c;这些作用主要体现在提高碳排放计量的精准度、推动绿色能源转型、促进电力领域低碳发展等方面&#xff1b;随着技术的不断发展和应用的不断深入相信智能电表将在碳中和实现过程中发挥更加重要的作用。以下是对智能电…

开始尝试从0写一个项目--前端(二)

修改请求路径的位置 将后续以及之前的所有请求全都放在同一个文件夹里面 定义axios全局拦截器 为了后端每次请求都需要向后端传递jwt令牌检验 ps&#xff1a;愁死了&#xff0c;翻阅各种资料&#xff0c;可算是搞定了&#xff0c;哭死~~ src\utils\request.js import axio…

【最新鸿蒙应用开发】——Router页面路由

Router路由 页面路由指的是在应用程序中实现不同页面之间的跳转&#xff0c;以及数据传递。通过 Router 模块就可以实现这个功能. 1. 创建页面 之前是创建的文件&#xff0c;使用路由的时候需要创建页面&#xff0c;步骤略有不同 方法 1&#xff1a;直接右键新建Page&#xf…

Python28-10 LightGBM对乳腺癌数据集进行分类

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一个梯度提升框架&#xff0c;由微软开发。它用于机器学习中的分类、回归和排序等任务&#xff0c;特别适合处理大规模数据和高维特征。LightGBM的核心是梯度提升决策树&#xff08;GBDT&#xff09;算法&am…

虚拟现实3d场景漫游体验实现了“所见即所得”

如今&#xff0c;从实体店铺到工厂企业&#xff0c;再到政府单位&#xff0c;各行各业都已纷纷加入VR数字化升级的行列&#xff0c;相比传统的2D商品展示&#xff0c;三维交互展示成为商企客户交流的主流方式。产品展示、服务介绍、考察洽谈等都可以通过在3D虚拟场景网站中真实…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

Chromium编译指南2024 Linux篇-安装官方工具depot_tools(二)

1.引言 在上一节中&#xff0c;我们已经完成了 Git 的安装&#xff0c;并了解了其在 Chromium 编译过程中的重要性。接下来&#xff0c;我们将继续进行环境的配置&#xff0c;首先是安装和配置 Chromium 编译所需的重要工具——depot_tools。 depot_tools 是一组用于获取、管…

你最近想通了什么事情?这10条职场经验帮助你活得更通透

1别总当老好人 记得刚步入职场那会儿&#xff0c;我简直是“老好人”的代名词。 无论是同事的额外任务&#xff0c;还是朋友的小忙&#xff0c;我总是二话不说就接下来&#xff0c;结果自己累得半死&#xff0c;换来的却是别人的理所当然和偶尔的忽视。 直到有一次&#xff…

云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍

一、DHCP工作原理 1.1、DHCP概念 动态主机配置协议 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;该协议允许服务器向客户端动态分配 IP 地址和配置信息。 DHCP协议支持C/S&#xff08;客户端/服务器&#xff09;结构&…

break 和 continue 的区别与用法

break 和 continue 的区别与用法 1、break 语句2、continue 语句3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JAVA中&#xff0c;break 和 continue 是两种常用的控制流语句&#xff0c;它们主要用于在循环结构中改变程序的执行…

Nacos 进阶篇---集群:选举心跳健康检查劳动者(九)

一、引言 本章将是我们第二阶段&#xff0c;开始学习集群模式下&#xff0c;Nacos 是怎么去操作的 &#xff1f; 本章重点&#xff1a; 在Nacos服务端当中&#xff0c;会去开启健康心跳检查定时任务。如果是在Nacos集群下&#xff0c;大家思考一下&#xff0c;有没有必要所有的…

无人直播系统源码开发:功能~优势~开发方法

自动直播通常是指通过自动化技术来实现实时内容分发的过程&#xff0c;它结合了流媒体技术和人工智能&#xff08;如机器学习&#xff09;。以下是自动直播实现的基本步骤&#xff1a; 内容采集&#xff1a;通过摄像头、手机等设备捕捉实时画面&#xff0c;并通过编码将其转换成…

rocketmq主从切换测试

服务器 192.168.1.23 nameserver、broker nameserver、brokerA&#xff0c;brokerB 192.168.1.35 nameserver、broker nameserver、brokerA&#xff0c;brokerB 192.168.1.88 nameserver nameserver 主从切换 关闭master&#xff1a;等待几秒钟23成为新的master slave消费测…

超市收银系统源码

今天给大家分享一套线上线下打通的收银系统&#xff0c;安卓/win双端线下收银台&#xff0c;可DIY、多模板的三端线上小程序商城&#xff0c;除此之外ERP进销存管理、商品管理、会员营销都很完善。 重点是系统支持OEM贴牌独立部署和全开源源码&#xff0c;非常适合一些正在寻找…

南航秋招指南,线上测评和线下考试

南航秋招简介 南航作为国内一流的航空公司&#xff0c;对人才的需求量非常旺盛&#xff0c;每年也有很多专业对口的工作提供给应届毕业生&#xff0c;对于应届毕业生而言&#xff0c;一定要抓住任何一个应聘机会&#xff0c;并且在规定的范围内进行简历的提交&#xff0c;以便…

CSS content 计数器

CSS content 计数器 CSS 计数器通过一个变量来设置&#xff0c;根据规则递增变量。 使用计数器自动编号 CSS 计数器根据规则来递增变量。 CSS 计数器使用到以下几个属性&#xff1a; counter-reset - 创建或者重置计数器&#xff0c;给计算器命名。注意声明计算器不能在自身…