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

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

一、索引的本质与作用

索引是帮助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分析执行计划,定期监控慢查询日志,实践中灵活运用覆盖索引、最左前缀等技巧。

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

相关文章:

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

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

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

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

大白话跨域问题的原理与多种解决方法的实现

大白话跨域问题的原理与多种解决方法的实现 跨域问题原理 简单来说,当一个网页中的JavaScript代码想要去访问另一个不同域名、端口或协议的服务器上的数据时,就会出现跨域问题。这是浏览器的一种安全机制,为了防止恶意网站窃取用户信息等。…...

el-table input textarea 文本域 自适应高度,切换分页滚动失效处理办法

场景: el-table 表格 需要 input类型是 textarea 高度是自适应,第一页数据都是单行数据 不会产生滚动条,但是第二页数据是多行数据 会产生滚动条, bug: 第一页切换到第二页 第二页滚动条无法展示 解决办法:直接修改样…...

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

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

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

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

【解决】OnTriggerEnter/OnTriggerExit 调用匿名委托误区的问题

开发平台:Unity 开发语言:CSharp 6.0 开发工具:Visual Studio 2022   问题背景 public void OnTriggerEnter(Collider collider) {output.OnInteractionNoticed () > OnInteractionTriggered?.Invoke(); }public void OnTriggerExit(C…...

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…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_list_init

ngx_list_init 定义在 src\core\ngx_list.h static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) {list->part.elts ngx_palloc(pool, n * size);if (list->part.elts NULL) {return NGX_ERROR;}list->par…...

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

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

GitHub开源协议选择指南:如何为你的项目找到最佳“许可证”?

引言 当你站在GitHub仓库创建的十字路口时,是否曾被众多开源协议晃花了眼? 别担心!这篇指南将化身你的"协议导航仪",用一张流程图五个灵魂拷问,帮你轻松找到最佳选择。无论你是开发者、开源爱好者&#xff…...

[密码学实战]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,在那里您会发现大量令人眼花缭乱…...

《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》

A telomere-to-telomere reference genome provides genetic insight into the pentacyclic triterpenoid biosynthesis in Chaenomeles speciosa Amplification of transposable elements 转座元件的扩增 Sequence mining disclosed that TEs were one main event in the ex…...

【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…...

移动端国际化翻译同步解决方案-V3

1.前言 因为软件出海,从在上上家公司就开始做翻译系统,到目前为止已经出了两个比较大的版本了,各个版本解决的痛点如下: V1版本: 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题,通过这个工具…...

多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标

“多空狙击线”指标 “多空狙击线”特色指标是量能型技术指标,主要用于分析股票市场中机构做多/做空力量的强程度。该指标的构成、定义与原理如下: “多空狙击线”指标,又称机构做多/做空能量线,通过计算和分析股票市场中机构做多/做空力量…...

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型?什么类型的思想或思路,它是如何实现的,我们要做零信任,需要考虑哪些问题? 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…...