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站:

相关推荐
敲代码的嘎仔14 分钟前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
夜晚中的人海26 分钟前
【C++】智能指针介绍
android·java·c++
南北是北北31 分钟前
list并发与共享
面试
南北是北北36 分钟前
泛型的三种型变类型:逆变,协变和不变
面试
正在走向自律1 小时前
RSA加密从原理到实践:Java后端与Vue前端全栈案例解析
java·前端·vue.js·密钥管理·rsa加密·密钥对·aes+rsa
咯哦哦哦哦1 小时前
关于QT 打印中文 乱码问题
java·数据库·qt
爱读源码的大都督1 小时前
天下苦@NonNull久矣,JSpecify总算来了,Spring 7率先支持!
java·后端·架构
木头没有瓜1 小时前
Slf4j 接口文档左侧菜单有显示,但是点击后空白
java
野犬寒鸦1 小时前
从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
java·数据库·redis·后端·缓存
ShooterJ2 小时前
Mysql小表驱动大表优化原理
数据库·后端·面试