当前位置: 首页 > news >正文

Java面试八股之MySQL索引B+树、全文索引、哈希索引

  1. MySQL索引B+树、全文索引、哈希索引

注意:B+树中B不是代表二叉树(binary),而是代表平衡(balance),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。

B+树的高度一般在2~4层,因此每次查询最多只需要2~4次IO。

1. B+树索引(BTREE)

特点:

B+树是一种自平衡的多路搜索树,它是一种高度平衡的结构,保证从根节点到任意叶子节点的路径长度几乎相等,从而保证了查询效率相对稳定。

B+树索引的所有数据都存储在叶子节点,并且叶子节点之间通过双向链表连接,形成了一个有序的数据集合。

支持范围查询、排序和分组操作,因为叶子节点是有序排列的。

可以是单列索引或多列索引(复合索引),并遵循最左前缀匹配原则,即在查询时,如果查询条件包含了复合索引的最左边部分列,就能利用索引进行高效查询。

适用于大部分查询场景,特别是等值查询、范围查询以及基于索引列的排序和分组。

优点:

查询效率较高,尤其是对于范围查询和有序结果集的获取。

能够处理大量数据,因为B+树的高度较低,即使数据量很大,查询深度也不会过高。

缺点:

对于非常小的数据集,建立和维护B+树索引可能比直接全表扫描更耗时。

对于等值查询,如果键值分布不均匀导致哈希冲突较少,哈希索引可能更快。

2. 全文索引

特点:

全文索引主要用于对文本类型的字段(如VARCHAR、TEXT)进行全文本搜索,能够处理复杂的查询条件,如包含某个词语或短语、近似匹配、词干提取等。

MySQL的全文索引通常基于倒排索引实现,即为每个单词建立一个索引项,记录下包含该单词的所有文档(在数据库中对应为记录)的列表及位置信息。

通常用于大型文本数据的全文检索,如博客文章、产品描述、文献资料等。

优点:

非常适合进行复杂文本内容的模糊查询和关键词搜索。

提供了对文本数据的高效过滤能力,显著减少针对文本字段进行LIKE '%keyword%'这类操作时的全表扫描。

缺点:

创建和维护全文索引需要消耗额外的空间和时间资源。

索引更新时有延迟,对于实时性要求较高的场景可能不合适(可通过手动刷新解决)。

对查询语法有一定要求,需要使用MATCH AGAINST语句,而非普通的WHERE子句。

对于短词、停用词(如“的”、“是”等常见词汇)的处理可能不够精确,可能需要配合语言分析器和定制化配置。

3. 哈希索引(HASH)

特点:

哈希索引基于哈希表实现,通过哈希函数将键值转换为固定长度的哈希值,然后通过哈希值直接定位到对应的记录。

主要适用于等值查询,查询效率极高,只需一次哈希计算即可找到相应记录(假设没有哈希冲突)。

不支持范围查询、排序和分组操作,因为哈希索引并不保持键值的有序性。

对于键值唯一性高的列(如唯一标识符),哈希索引效果尤为出色。

通常用于内存型存储引擎(如MEMORY引擎)或者InnoDB引擎的自适应哈希索引(Adaptive Hash Index,AHI)。

优点:

等值查询性能极高,尤其在键值分布均匀且唯一性强的情况下。

查找时间复杂度接近O(1),在理想情况下能提供极快的查询速度。

缺点:

只适用于等值查询,无法处理范围查询、排序和分组。

如果键值分布不均导致哈希冲突较多,性能会下降,尤其是在存在大量重复键值的情况下。

不支持部分索引列的匹配(如复合索引的部分列查询)。

哈希索引不存储原始键值,只存储哈希值和行指针,因此不能避免对数据行的访问来获取完整数据。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Springboot项目实训--day2
  • LabVIEW在半导体自动化测试中的应用
  • 植物大战僵尸杂交版全新版v2.2解决无法打开问题和全屏问题
  • 【删库跑路】一次删除pip下载的所有第三方库方法
  • In Search of Lost Online Test-time Adaptation: A Survey--论文笔记
  • python爬虫之scrapy基于管道持久化存储操作
  • Rust入门实战 编写Minecraft启动器#2建立资源模型
  • 初阶C++(二)
  • AI赋能OFFICE 智能化办公利器!
  • Simulink生成代码时端口名称乱码问题
  • ChatGPT-4 对比 ChatGPT-3.5:有哪些优势
  • 有线网络台式电脑打游戏每天要断线几次又自动连接解决
  • LabVIEW从测试曲线中提取特征值
  • 自动化办公004—有效解决ChatGPT数学公式无法复制到Office、MarkDown的问题
  • Apache tika 实现各种文档内容解析
  • CODING 缺陷管理功能正式开始公测
  • docker-consul
  • input实现文字超出省略号功能
  • python大佬养成计划----difflib模块
  • Python学习之路13-记分
  • quasar-framework cnodejs社区
  • tensorflow学习笔记3——MNIST应用篇
  • Vue2 SSR 的优化之旅
  • webgl (原生)基础入门指南【一】
  • 面试遇到的一些题
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 数据科学 第 3 章 11 字符串处理
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​渐进式Web应用PWA的未来
  • #pragma multi_compile #pragma shader_feature
  • #pragma 指令
  • (~_~)
  • (152)时序收敛--->(02)时序收敛二
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C11) 泛型表达式
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (九)信息融合方式简介
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .bat文件调用java类的main方法
  • .chm格式文件如何阅读
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 发送邮件
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET6 命令行启动及发布单个Exe文件
  • .net实现客户区延伸至至非客户区
  • .NET学习全景图
  • /bin/rm: 参数列表过长"的解决办法
  • @DependsOn:解析 Spring 中的依赖关系之艺术