MySql的索引与算法-B+树索引

news/2024/11/29 8:38:04/

作者:逍遥Sean
简介:一个主修Java的Web网站\游戏服务器后端开发者
主页:https://blog.csdn.net/Ureliable
觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言!

前言

  索引在实际应用MySql数据库时,是一个值得注意的地方。索引太多会影响到系统的性能;索引缺失或者不足,又会影响系统的查询效率。
  一个数据表需不需要索引?这应该在开发阶段就应该确定的问题。开发人员在确定需求时,要根据业务的需求,合适的添加数据表索引。尽量避免最后通过监控流量的方式去确定索引的添加与否。
  当然,索引的添加与否是有一定的技术含量的。如果开发者实在不确定要不要添加索引,还是留到最后进行流量监控比较稳妥。
  综上,本文意在对MySql索引的内部机制做一个深入(🤫)的解析,通过了解索引的内部结构,可以帮助开发者判断哪里可以使用索引,如何正确使用索引…

MySql的索引与算法

  • MySQL支持的索引
  • B+树
  • B+树索引
    • 聚集索引
    • 辅助索引
    • B+树索引的分裂
    • B+树索引的管理
  • B+树索引的使用
    • 联合索引
    • 覆盖索引

MySQL支持的索引

  1. B-Tree索引:这是最常见的索引类型,在MySQL中被广泛使用。它可以加速基于等值查询、范围查询和排序的操作。
  2. 哈希索引:哈希索引只支持等值查询,不能用于范围查询和排序。它在某些情况下可以比B-Tree索引更快。
  3. 全文索引:全文索引可以用于快速搜索文本数据,支持基于关键词的搜索和短语搜索。
  4. 空间索引:空间索引可以用于快速搜索地理位置数据,支持基于距离的查询和范围查询。
  5. 其他类型的索引:MySQL还支持其他类型的索引,如前缀索引、组合索引等。

本文主要介绍最常见的B+树索引

B+树

B+树是一种多路平衡查找树,常用于数据库和文件系统中。与B树相比,B+树在内存中存储的是索引节点,数据节点只存储实际数据,可以减少内存使用。
B+树的特点是:

  1. 所有关键字都在叶子节点出现,叶子节点形成一个有序单链表,便于区间查找和遍历。
  2. 所有非叶子节点可以看成是索引,结构简单,查询效率更高。

B+树索引

聚集索引

聚集索引(Clustered index)通过重组表的物理结构来提高查询性能。它的特点是将数据存储在索引中,因此聚集索引是按照索引的顺序存储数据的。聚集索引只能创建一个,因为数据只能按照一种方式排序。

聚集索引可以提高查询性能,因为它能够减少磁盘访问的次数,从而提高查询的速度。当查询使用聚集索引时,数据库引擎可以直接通过索引在磁盘上查找数据,而不需要访问表中的每一行数据,从而减少了磁盘访问的次数。

但聚集索引也有一些限制和局限,比如索引字段的选择很重要,因为索引字段的数据类型、长度、选择、顺序等因素都会影响查询性能。此外,聚集索引还会影响表的插入、删除和更新操作的性能。因此,在选择聚集索引时需要考虑多方面的因素。

辅助索引

辅助索引(Secondary Index)也称为非聚集索引(Non-Clustered Index)。辅助索引是基于字段值的副本建立的,而不是基于实际数据记录。该索引结构可以加速数据查询操作,并提高查询效率

与主键索引不同的是,辅助索引不会改变数据记录的物理存储顺序。通过辅助索引,可以快速查找某个字段值所对应的数据记录的位置,然后再获取该记录的实际数据内容。

辅助索引可以提高查询效率,但是也会导致索引维护的时间和空间开销增加。因此,在设计数据库索引时,需要根据实际情况综合考虑利弊,选择合适的索引策略。

B+树索引的分裂

B+树索引的分裂是指当B+树某个节点的关键字数超过了该节点的度数时,需要将该节点分裂成两个新节点,并将其中一部分关键字提升到父节点上,以保持B+树的平衡性和搜索效率。B+树索引的分裂过程如下:

  1. 找到需要分裂的节点。
  2. 将该节点中位于最中间的关键字提升到父节点中。
  3. 将该节点的右半部分拆分成一个新的节点。
  4. 父节点将新增的右半部分节点作为一个子节点。
  5. 更新父节点的指针和关键字。

B+树索引的分裂是B+树的基本操作之一,可以使B+树保持平衡性和高效性。分裂节点的过程中需要进行关键字的拆分和移动,需要消耗一定的时间和空间资源。因此,在实际应用中,通常需要在数据存储和索引查询之间进行权衡,以确定适当的B+树度数和节点大小,以提高分裂的效率。

B+树索引的管理

  1. 创建B+树索引:可以在表的某个列上创建B+树索引,以提高该列的查询效率。创建索引时需要考虑索引的类型、大小和是否要使用唯一索引等因素。

  2. 维护B+树索引:在表中插入、更新、删除数据时,需要确保B+树索引的正确性。这可以通过在B+树索引上执行插入、更新和删除操作来完成。

  3. 优化B+树索引:如果B+树索引的性能不良,则需要进行优化。这可以通过重新组织B+树来完成,以消除不平衡和碎片化。

  4. 删除B+树索引:在表的某个列上删除B+树索引时,需要确保不影响表的其他操作。可以通过ALTER TABLE语句删除B+树索引。

  5. 监控B+树索引:监控B+树索引的性能和状态,以确保其有效性。可以使用性能监视工具和数据库日志来监视B+树索引的状态和更新。

  6. 备份B+树索引:对于重要的B+树索引,需要备份以防数据丢失。可以使用数据库管理系统提供的备份工具进行备份。

B+树索引的使用

联合索引

B+树索引可以实现联合索引。联合索引是指在多个列上建立的索引,可以有效地提高查询效率,特别是在联合查询中的效率更高。在B+树索引中,联合索引会将多个列的值在B+树上组合成一个键值,然后根据这个键值来进行查找。

例如,假设有一个表包含两个列:name和age,我们可以在这两个列上建立联合索引。建立联合索引时,会将两个列的值组合成一个键值,例如:“John,25”。然后,这个键值将被插入到B+树中,使得每个键值都与一个指向具有相同键值的行的指针相关联。

当需要使用这个联合索引进行查询时,可以根据任意一个或两个列的值来进行查找。例如,可以使用"John,25"来查找与该键值相关联的行,也可以只使用"name"来进行查找。

B+树索引实现联合索引可以提高查询效率,尤其是在多列联合查询的情况下。

联合索引并不一定是B+树索引,它可以使用多种数据结构实现。B+树索引是一种常用的实现方式,但也有其他的实现方式。例如,哈希表可以实现联合索引,但在某些情况下可能不如B+树索引效率高。因此,具体使用什么样的数据结构实现联合索引取决于实际情况和需求。

覆盖索引

覆盖索引是指在B+树索引中,除了存储索引键值以外,还存储了其他需要的查询字段的值,从而可以通过B+树索引直接满足查询需要,而无需再到数据表中查询。这种索引方式也被称为索引覆盖。

覆盖索引的好处是可以减少IO访问次数和数据传输量,从而提高查询性能。因为不需要再到数据表中查询,所以查询过程中只需要访问和读取B+树索引页中的数据,而不涉及到数据表的访问。

覆盖索引的缺点是,如果覆盖索引中存储的字段较多,那么索引的大小也会相应增加,从而会导致B+树索引的高度增加,查询性能也会受到影响。因此,在实现覆盖索引时需要权衡存储索引字段和查询字段的个数和大小,以达到最佳的性能和存储效率。


http://www.ppmy.cn/news/1129271.html

相关文章

springboot导入excel(POI)

POI官方文档 引入依赖 <!--POI--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId&…

P2466 [SDOI2008] Sue 的小球(区间dp)

P2466 [SDOI2008] Sue 的小球&#xff08;区间dp&#xff09; 链接&#xff1a;P2466 [SDOI2008] Sue 的小球 很有意思的一道题&#xff0c;想各种方法都无从下手&#xff0c;看了洛谷题解瞬间懂了。 题意 有 n n n 个物品&#xff0c;每个物品的位置在 x i x_i xi​&…

【每日一题Day340】LC2251花期内花的数目 | 差分+哈希表+排序 排序+二分查找

花期内花的数目【LC2251】 给你一个下标从 0 开始的二维整数数组 flowers &#xff0c;其中 flowers[i] [starti, endi] 表示第 i 朵花的 花期 从 starti 到 endi &#xff08;都 包含&#xff09;。同时给你一个下标从 0 开始大小为 n 的整数数组 people &#xff0c;people[…

React useRequest解读

源码结构&#xff1a; 可以看到虽然是一个hooks&#xff08;具有一定功能且具备状态的单一函数&#xff09; 但是各种文件功能分得也是很细的&#xff0c;方便抽离和复用 useRequest.ts 抽离的原则还是单一功能原则 可以看出 真正的hooks实现是在Implement里 对于类型type的引…

C#并发编程的实现方式

一、多线程&#xff1a;是一种并发编程技术&#xff0c;它允许一个应用程序同时执行多个线程。每个线程都有自己的指令集和堆栈&#xff0c;可以在不同的CPU核心上并行运行&#xff0c;或者在一个CPU核心上通过时间片轮转的方式交替运行。多线程的主要优点是可以利用多核处理器…

Python数据和Json数据的相互转换

什么是JSON&#xff1f; JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能:JSON就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互 Python数据和Json数据的相互…

面试问到MySQL模块划分与架构体系怎么办

面试问到Mysql模块划分与架构体系怎么办 文章目录 1. 应用层连接管理器&#xff08;Connection Manager&#xff09;安全性和权限模块&#xff08;Security and Privilege Module&#xff09; 2. MySQL服务器层2.1. 服务支持和工具集2.2. SQL Interface2.3. 解析器举个解析器 …

MATLAB算法实战应用案例精讲-【优化算法】基于房地产市场的优化算法(REMARK)(附MATLAB代码实现)

代码实现 MATLAB main.m clc, clear rng(shuffle) format short e options.nDim = 2; options.nDemander = 80; options.nSupplier = ceil(options.nDemander/4); options.maxFrnd = ceil(options.nDemander/4); options.constrPer = 10; options.KsigmaD = 0.7; options.Ks…