mysql 索引详解

我们在看一本书的时候,想找到相关的知识,先去看目录,然后定位到页码,然后找到对应的知识。mysql中的索引就是类似于目录的作用。

一、索引类型:

1.B-Tree索引

B-Tree通常意味着所有的值都是按照顺序存储的,并且每一个叶子页到根的距离相同。

B-TREE

每个节点都是一个二元数组: [key, data],所有节点都可以存储数据。key为索引key,data为除key之外的数据。结构如下:

检索原理:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或未找到节点返回null指针。

缺点:1.插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。造成IO操作频繁。2.区间查找可能需要返回上层节点重复遍历,IO操作繁琐。

B+TREE

与B-Tree相比,B+Tree有以下不同点:非叶子节点不存储data,只存储索引key;只有叶子节点才存储data。是一个平衡的多叉树,而且同层级的节点间有指针相互链接。结构如下图:

Mysql中B+Tree:在经典B+Tree的基础上进行了优化,增加了顺序访问指针。在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。这样就提高了区间访问性能:如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率(无需返回上层父节点重复遍历查找减少IO操作)。

适用于B-TREE索引的查询类型:

等值匹配,范围匹配或者值前缀匹配。MySQL只能高效的使用索引的最左前缀列。因此,值前缀只支持最左前缀列。

因为是顺序存储,因此,很容易做排序操作。

   

2 hash索引

对于每一行数据,都会计算一个哈希码,哈希码是一个较小的值,不同键值的行计算出来的hash值也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目中。

因为索引自身只需要存储对应的哈希值,因此,哈希索引查询速度非常快。

哈希索引的限制:

  • 哈希索引中只保存了哈希值和指针,不存储字段值,所以不能使用索引中的值来避免读取行。

  • 因为不是按照顺序存储,无法用于排序。

  • 不支持最左前缀列。例如在(A,B)上建立哈希索引,查询只有数据A,无法使用索引。

  • 只支持等值比较查询,包括=,IN(),<=,>=,不支持范围查询,例如<,>

  • 访问数据速度很快,除非有很多哈希冲突,则需要遍历链表中的所有指针。

  • 建立索引时,如果选择了哈希冲突很多的列,索引维护操作的代价比较大。例如,想要删掉某行数据,哈希冲突比较多,需要花很多时间去找到链表中的位置,然后删掉引用。

注意:

在InnoDB引擎中有一个特殊的功能叫做:“自适应哈希索引”。当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B-Tree索引之上,再创建一个哈希索引。

3.聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于引擎的实现方式。主要说InnoDB引擎。

InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。

数据行和相邻的键值紧凑地存储在一起,因此,无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。

InnoDB通过主键聚集数据。如果没有定义主键,那么InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键作为聚簇索引。

优点

  • 可以把相关的数据保存到一起,例如实现电子邮箱,可以根据用户ID来聚集数据,这样只需要从磁盘读取一次,就可以获取用户的全部邮件。

  • 数据访问快。

  • 使用覆盖索引扫描的查询可以直接使用叶节点中的主键值。

缺点

  • 如果数据全部放在内存中,访问顺序不重要,因此聚簇索引没有什么优势。

  • 插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。如果不是按照主键顺序加载数据,加载完成之后最好使用OPTIMIZE TABLE命令重新组织下表。

  • 更新聚簇索引列的代价很高。

  • 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行时,可能面临页分裂问题。页分裂会导致表占用更多的磁盘空间。

  • 二级索引(非聚簇索引)可能比想象的大,因为在二级索引的叶子节点上包含了引用行的主键列。

  • 二级索引访问需要两次索引查找,而不是一次。

4.覆盖索引

msyql可以使用索引来直接获取列的数据,这样就不需要再读取数据行,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称为覆盖索引。

优点

  • 索引条目通常远小于数据行大小,如果只需要读取索引,那么mysql就会极大的减少数据访问量。对于I/O密集型的应用也有帮助,因为索引比数据更小。

  • 索引时按照列值顺序存储的,所以对于I/O密集型的范围查询比随机从磁盘上读取每一行数据的I/O要少的多。对于MyISAM引擎,可以通过OPTIMIZE TABLE命令让索引完全顺序排列。

  • 由于InnoDB的聚簇索引,覆盖索引对InnoDB表特别有用。InnoDb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引都不存储索引列的值,所以mysql只能使用B-Tree索引来做覆盖索引。不是所有的引擎都支持覆盖索引。

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)内容概要:本文围绕多旋翼无人机组合导航系统,重点介绍了基于多源信息融合算法的设计与实现,利用Matlab进行代码开发。文中采用扩展卡尔曼滤波(EKF)作为核心融合算法,整合GPS、IMU(惯性测量单元)、里程计和电子罗盘等多种传感器据,提升无人机在复杂环境下的定位精度与稳定性。特别是在GPS信号弱或丢失的情况下,通过IMU惯导据辅助导航,实现连续可靠的位姿估计。同时,文档展示了完整的算法流程与Matlab仿真实现,涵盖传感器据预处理、坐标系转换、滤波融合及结果可视化等关键环节,体现了较强的工程实践价值。; 适合人群:具备一定Matlab编程基础和信号处理知识,从事无人机导航、智能控制、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多旋翼无人机的高精度组合导航系统设计;②用于教学与科研中理解多传感器融合原理与EKF算法实现;③支持复杂环境下无人机自主飞行与定位系统的开发与优化。; 阅建议:建议结合Matlab代码与理论推导同步学习,重点关注EKF的状态预测与更新过程、多传感器据的时间同步与坐标变换处理,并可通过修改噪声参或引入更多传感器类型进行扩展实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值