Java面试第七山!《MySQL索引》

news2025/3/5 3:25:08

一、索引的本质与作用

索引是帮助MySQL高效获取数据的数据结构,类似于书籍的目录。它通过减少磁盘I/O次数(即减少数据扫描量)来加速查询,尤其在百万级数据场景下,索引可将查询效率提升数十倍。

核心作用

  1. 加速查询:避免全表扫描,快速定位数据。

  2. 保证数据唯一性:唯一索引可避免重复值。

  3. 优化排序与分组:索引天然有序,减少排序开销。


二、索引的底层数据结构:B+树

为什么选择B+树?

MySQL索引默认使用B+树而非二叉树、红黑树或B树,原因如下:

对比项B+树优势
树高控制节点存储多个键值,树高通常为3~4层,支持千万级数据(如单节点可存约1170个键)。
范围查询叶子节点通过指针形成有序链表,适合BETWEENORDER BY等操作。
磁盘I/O优化每次读取一页(16KB),充分利用局部性原理,减少磁盘寻道次数。


(图示:B+树的非叶子节点仅存键值,叶子节点存储完整数据或主键,并形成有序链表)


三、存储引擎的索引实现差异

1. InnoDB vs MyISAM

特性InnoDB(聚集索引)MyISAM(非聚集索引)
数据存储数据与索引合并存储(.ibd文件)数据(.MYD)与索引(.MYI)分离
主键索引叶子节点存储完整数据行叶子节点存储数据行地址
辅助索引存储主键值,需回表查询直接存储数据地址
事务支持

示例

  • InnoDB查询流程:通过辅助索引找到主键,再通过主键索引获取数据(二次查找)。

  • MyISAM查询流程:直接通过索引找到数据地址,一次定位。


四、索引类型与使用场景

1. 常见索引类型

类型特点
主键索引唯一且非空,InnoDB中为聚集索引
唯一索引列值唯一,允许NULL
联合索引多列组合索引,遵循最左前缀原则(如(a,b,c)仅支持aa,b等)
覆盖索引索引包含查询所需字段,避免回表(如SELECT id FROM table WHERE name=?)。

2. 联合索引的最左前缀原则

示例:索引(name, age, position)

  • ✅有效查询:WHERE name='Alice' AND age=25

  • ❌无效查询:WHERE age=25(未以name开头)

原理:索引按字段顺序构建,只有左前缀字段有序,后续字段仅在左前缀固定时有序。


五、索引优化实战技巧

1. 索引失效的六大场景

  1. 未遵循最左前缀:如跳过联合索引首字段。

  2. 索引列使用函数或计算:如WHERE YEAR(create_time)=2023

  3. 类型不一致:如字符串列用数字查询(WHERE id='100')。

  4. LIKE以通配符开头:如LIKE '%abc'

  5. OR连接非索引列:如WHERE a=1 OR b=2(若b无索引)。

  6. 全表扫描更快:当数据量小时,优化器可能放弃索引。

2. 分页查询优化

问题LIMIT 100000,10会扫描前100010行,效率极低。
优化方案:使用覆盖索引+延迟关联。

SELECT * FROM table 
JOIN (SELECT id FROM table ORDER BY id LIMIT 100000, 10) AS tmp 
ON table.id = tmp.id;

3. 索引设计原则

  • 选择性高:列值区分度高(如COUNT(DISTINCT col)/COUNT(*) > 0.1)。

  • 短字段优先:整型比字符串更适合索引(主键推荐自增整型)。

  • 避免冗余:联合索引可替代多个单列索引。


六、高频面试题解析

1. 为什么InnoDB推荐自增主键?

  • 顺序写入:减少页分裂和碎片,提升插入效率。

  • 存储紧凑:整型比UUID更省空间,加速比较。

2. 什么是回表?如何避免?

  • 回表:通过辅助索引找到主键后,需回主键索引获取完整数据。

  • 避免方法:使用覆盖索引(如SELECT id, name,若索引包含这两个字段)。

3. B+树 vs B树

对比项B+树B树
数据存储仅叶子节点存数据所有节点均可存数据
查询效率稳定O(logN),适合范围查询随机查询更快,但范围查询差
空间占用非叶子节点更小,存储更多键值节点存储数据,占用更大空间

七、总结

理解索引底层原理(B+树结构、存储引擎差异)是优化数据库性能的关键。合理设计索引可让查询速度提升数十倍,而盲目添加索引可能导致写入性能下降。建议结合EXPLAIN分析执行计划,定期监控慢查询日志,实践中灵活运用覆盖索引、最左前缀等技巧。

翻过这座山,他们就会听到你的故事!

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

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

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

动态表头报表的绘制与导出

目录 一、效果图 二、整体思路 三、代码区 一、效果图 根据选择的日期范围动态生成表头(eg:2025.2.24--2025.03.03)每个日期又分为白班、夜班;数据列表中对产线合并单元格。支持按原格式导出对应的报表excel。 点击空白区可新…

DeepSeek 助力 Vue3 开发:打造丝滑的密码输入框(Password Input)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

Linux 基础---文件权限

概念 文件权限是针对文件所有者、文件所属组、其他人这三类人而言的,对应的操作是chmod。设置方式:文字设定法、数字设定法。 文字设定法:r,w,x,- 来描述用户对文件的操作权限数字设定法:0,1,2,3,4,5,6,7 来描述用户对文件的操作…

SpringBoot五:JSR303校验

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 松散绑定 意思是比如在yaml中写的是last-name,这个和lastName意思是一样的,-后的字母默认是大写的 JSR303校验 就是可以在字段增加…

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …

Error Density-dependent Empirical Risk Minimization

经验误差密度依赖的风险最小化 v.s. 经验风险最小化 论文: 《 Error Density-dependent Empirical Risk Minimization》 发表在: ESWA’24 相关代码: github.com/zxlml/EDERM 研究背景 传统的经验风险最小化(ERM)方…

02_NLP文本预处理之文本张量表示法

文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…

Spring Boot全局异常处理:“危机公关”团队

目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理(附上代码实例)三、总结: 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢&#x1…

C# OnnxRuntime部署DAMO-YOLO香烟检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…

[密码学实战]Java生成SM2根证书及用户证书

前言 在国密算法体系中,SM2是基于椭圆曲线密码(ECC)的非对称加密算法,广泛应用于数字证书、签名验签等场景。本文将结合代码实现,详细讲解如何通过Java生成SM2根证书及用户证书,并深入分析其核心原理。 一、证书验证 1.代码运行结果 2.根证书验证 3.用户证书验证 二、…

安装 cnpm 出现 Unsupported URL Type “npm:“: npm:string-width@^4.2.0

Unsupported URL Type "npm:": npm:string-width^4.2.0 可能是 node 版本太低了,需要安装低版本的 cnpm 试试 npm cache clean --force npm config set strict-ssl false npm install -g cnpm --registryhttps://registry.npmmirror.com 改为 npm insta…

探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…

四、数据存储

在爬虫项目中,我们需要将目标站点数据进行持久化保存,一般数据保存的方式有两种: 文件保存数据库保存 在数据保存的过程中需要对数据完成去重操作,所有需要使用 redis 中的 set 数据类型完成去重。 1.CSV文件存储 1.1 什么是c…

C# OnnxRuntime部署DAMO-YOLO人头检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…

Metal学习笔记七:片元函数

知道如何通过将顶点数据发送到 vertex 函数来渲染三角形、线条和点是一项非常巧妙的技能 — 尤其是因为您能够使用简单的单行片段函数为形状着色。但是,片段着色器能够执行更多操作。 ➤ 打开网站 https://shadertoy.com,在那里您会发现大量令人眼花缭乱…

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境(xxx是mac的username&a…

蓝桥杯web第三天

展开扇子题目, #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子,子元素旋转 webkit display: -webkit-box:将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical:设置伸缩盒子的子元素排列方…

Qt基础入门-详解

前言 qt之路正式开启 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&#x1f44…

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…