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

【大白话说Java面试题 第71题】【Mysql篇】第1题:索引是什么?

📌PDF:大白话说Java面试题 — 03-Mysql篇

第1题:索引是什么

📚回答:

  • 核心考点
    索引是数据库性能优化的核心手段。大厂面试要求能说出本质(数据结构)作用(快 vs 慢)代价(存储 + 写放大),并能解释为什么不是越多越好

1. 索引的本质
  • 定义
    索引是排好序数据结构(MySQL InnoDB默认为B+Tree),用于快速定位数据行,避免全表扫描。

  • 时间复杂度对比

    • 无索引:全表扫描 O(N)
    • 有索引(B+Tree):O(log N)

2. 索引的工作原理(B+Tree简解)
特性说明
多路平衡树每个节点存储多个key,树高度低(通常2~4层)
叶子节点存放数据(聚簇索引)或主键值(二级索引)数据只存在叶子节点
叶子节点双向链表支持范围扫描(BETWEEN><
非叶子节点只存key + 指针可全部缓存在内存中,加速查找

图示逻辑

[根节点] → 分支节点 → 叶子节点(数据页) → 叶子节点 → 叶子节点(双向链表)

3. 索引的类型与特点
索引类型说明叶子节点内容是否必须回表
主键索引(聚簇索引)表的主键自动建立完整行数据
二级索引(非聚簇索引)普通/唯一/联合索引主键值(需回表)
唯一索引列值唯一,可null同二级索引
联合索引多列组合主键值
全文索引文本分词检索特殊格式特殊
哈希索引(Memory引擎)等值查询快数据指针不支持范围

关键点

  • 每张表只有一个聚簇索引(主键无则选第一个唯一非空列,再无则隐藏row_id)
  • 二级索引查到的只是主键值,需要再查主键索引才能得到完整行 →回表

4. 索引的优缺点(面试必背)
优点缺点
查询速度提升(O(N) → O(log N))占用额外磁盘空间(通常为数据的1%~5%)
唯一索引保证数据唯一性INSERT/UPDATE/DELETE 变慢(需同步更新索引)
加速排序(ORDER BY索引过多影响写性能,优化器选错索引
加速分组(GROUP BY过长字段建索引浪费空间

公式

索引不是越多越好。读多写少可多建,写多读少需控制数量。


5. 联合索引与最左前缀原则(高频面试题)

联合索引示例INDEX(a, b, c)

查询条件是否使用索引使用哪些列
WHERE a = 1a
WHERE a = 1 AND b = 2a, b
WHERE a = 1 AND b = 2 AND c = 3a, b, c
WHERE a = 1 AND c = 3✅(部分)a(c用索引下推)
WHERE b = 2无(缺最左列a)
WHERE a = 1 ORDER BY ba 索引,b 利用排序
WHERE a = 1 ORDER BY c✅(但需filesort)a 索引,c 不能直接排序

最左前缀原则

  • 查询条件必须从索引最左列开始,且不能跳过中间列
  • 跳过一列,后面的列无法用于索引查找,但可能用于索引下推(ICP)

6. 回表与覆盖索引(大厂深度)

回表

  • 二级索引查到主键 → 再去聚簇索引查完整行
  • 代价:每次回表是一次随机I/O,回表行数多时性能下降

覆盖索引

  • 当查询的所有列都在索引中时,不需要回表
  • 示例:
    -- 索引:INDEX(name, age)SELECTname,ageFROMuserWHEREname='张三';-- 覆盖索引,不回表SELECTname,age,idFROMuserWHEREname='张三';-- 回表(id可能不在索引)

优化技巧:把频繁查询的字段放入联合索引,变成覆盖索引。


7. 索引失效典型场景(面试必考)
场景原因示例(假设索引name
函数操作索引列被计算/函数WHERE LOWER(name) = 'zhang'
隐式类型转换字符串列传intWHERE name = 123(转字符串比)
使用!=<>不等号很难用索引WHERE age <> 30
LIKE '%abc'通配符开头的模糊匹配WHERE name LIKE '%张'
OR未全索引OR两边不全有索引WHERE name='a' OR age=30(age无索引)
联合索引不遵循最左前缀缺少最左列索引(a,b)WHERE b=1

8. 面试官追问示例

Q1:为什么不建议在低基数列(如性别)建索引?
A:低基数(如性别只有男/女)索引选择性差。查询WHERE gender='男'可能返回50%数据,优化器会全表扫描而不是用索引。

Q2:B+TreeB-Tree区别?
A:B+Tree非叶子节点不存数据,叶子节点存全部数据且双向链表,更适合范围查询和顺序扫描。MySQL InnoDB使用B+Tree。

Q3:主键用UUID有什么问题?
A:UUID随机无序,插入时页分裂频繁,写性能差;且占用16字节,二级索引叶子节点存储主键值,空间浪费大。推荐自增整型/BigInt。

Q4:什么是索引下推(ICP)?
A:MySQL 5.6+优化。联合索引中,存储引擎层先过滤可用的索引列,减少回表次数。比如INDEX(a,c)WHERE a=1 AND c=2,先用c=2过滤再回表。

Q5:一条查询同时有联合索引(a,b)和单列索引a,优化器会选哪个?
A:通常选(a,b),因为能覆盖更多条件。但优化器会基于代价估算(IO+CPU),如果a列重复度高可能走单列。


9. 总结对比表
维度无索引有索引
查询速度慢(全表扫描)快(O(log N))
写入速度慢(需维护索引)
磁盘占用高(额外空间)
维护成本高(索引选择、重建)

💡面试官想要的满分总结

“索引本质上是排好序的B+Tree数据结构,通过二分查找和树的高度压缩实现快速数据定位,避免全表扫描。
优点是查询效率极高,缺点是占用磁盘拖慢写操作
需掌握聚簇/二级索引区别、最左前缀原则回表与覆盖索引,并熟悉索引失效的典型场景(函数、隐式转换、LIKE ‘%…’)。
生产建索引口诀:等值查前置、区分度高的靠前、覆盖索引优化回表、写多读少谨慎加。”


觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯

http://www.jsqmd.com/news/870839/

相关文章:

  • AI生产就绪的五大基础设施断裂点与实战解法
  • Unity图表性能优化:从折线图到饼图的底层实现与避坑指南
  • 深入CPU内部:8086的MUL指令是如何工作的?从硬件视角理解乘法结果为何放在AX和DX
  • 终极跨平台条码处理方案:ZXing.Net让.NET应用轻松实现二维码识别与生成
  • VR-Reversal:打破设备限制,让3D视频在普通屏幕“活“起来
  • uVision调试器硬件需求与配置全指南
  • 别再乱关防火墙了!ESXi 7.0/8.0 安全开放自定义端口的保姆级教程(附配置文件详解)
  • 终极指南:5步永久免费解锁Cursor AI Pro功能,告别试用限制
  • 歌词时间轴制作工具:让音乐与文字完美同步
  • 从执行计划到语义重写,Claude自动优化SQL的7层决策链,你只掌握了第1层?
  • Boundary-Seeking GAN:离散序列生成的可微解法
  • 别再混淆了!I420、NV12、NV21这些YUV格式到底怎么选?附FFmpeg实战代码
  • 从数据探索到商业报告:如何用Neo4j Bloom、Graphileon和NeoDash搭建完整的数据工作流
  • 工业级i.MX6主板:双路高清视频与CAN/RS485数据综合采集方案
  • Keil编译器数据类型详解与嵌入式开发实践
  • 频域卷积与FFT加速实现技术解析
  • 3个关键技巧:用ProperTree告别Plist编辑的繁琐与混乱
  • 5个实战技巧:Unlock-Music浏览器端音乐解密技术深度解析
  • UVa 276 Egyptian Multiplication
  • 告别SSH!用这个Luci插件在OpenWrt网页后台直接写Shell脚本(附保姆级安装教程)
  • 如何在macOS上无缝运行Windows应用?Whisky为你提供终极解决方案
  • 终极指南:gibMacOS - 轻松获取官方macOS安装文件的完整解决方案
  • G-Helper终极指南:告别Armoury Crate臃肿体验的3步高效方案
  • 利用Taotoken统一API简化多模型应用的原型开发
  • 2026年5月潍坊游泳池建设指南:专业视角下的合理选型与避坑攻略 - 2026年企业推荐榜
  • docx2tex:Word转LaTeX的技术革命,如何用XML处理栈解决学术排版难题
  • 如何快速提取碧蓝航线Live2D模型:面向创作者的完整指南
  • 安检机图像处理踩坑实录:从条纹校正到物质分类,那些论文里不会告诉你的细节
  • Keil MDK 5示例项目缺失问题解决方案
  • 2026湖北黄石瓷砖空鼓翘边维修公司靠谱品牌排名:雨和虹防水维修/雨盛防水维修/秦鑫斌防水维修/森之澜漏水检测/能亿防水补漏/成诺防水修缮 - 雨和虹防水维修