
PDF大白话说Java面试题 — 03-Mysql篇第1题索引是什么回答核心考点索引是数据库性能优化的核心手段。大厂面试要求能说出本质数据结构、作用快 vs 慢、代价存储 写放大并能解释为什么不是越多越好。1. 索引的本质定义索引是排好序的数据结构MySQL InnoDB默认为BTree用于快速定位数据行避免全表扫描。时间复杂度对比无索引全表扫描 O(N)有索引BTreeO(log N)2. 索引的工作原理BTree简解特性说明多路平衡树每个节点存储多个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 1✅aWHERE a 1 AND b 2✅a, bWHERE a 1 AND b 2 AND c 3✅a, b, cWHERE a 1 AND c 3✅部分ac用索引下推WHERE b 2❌无缺最左列aWHERE a 1 ORDER BY b✅a 索引b 利用排序WHERE a 1 ORDER BY c✅但需filesorta 索引c 不能直接排序最左前缀原则查询条件必须从索引最左列开始且不能跳过中间列跳过一列后面的列无法用于索引查找但可能用于索引下推ICP6. 回表与覆盖索引大厂深度回表二级索引查到主键 → 再去聚簇索引查完整行代价每次回表是一次随机I/O回表行数多时性能下降覆盖索引当查询的所有列都在索引中时不需要回表示例-- 索引INDEX(name, age)SELECTname,ageFROMuserWHEREname张三;-- 覆盖索引不回表SELECTname,age,idFROMuserWHEREname张三;-- 回表id可能不在索引优化技巧把频繁查询的字段放入联合索引变成覆盖索引。7. 索引失效典型场景面试必考场景原因示例假设索引name函数操作索引列被计算/函数WHERE LOWER(name) zhang隐式类型转换字符串列传intWHERE name 123转字符串比使用!或不等号很难用索引WHERE age 30LIKE %abc通配符开头的模糊匹配WHERE name LIKE %张OR未全索引OR两边不全有索引WHERE namea OR age30age无索引联合索引不遵循最左前缀缺少最左列索引(a,b)WHERE b18. 面试官追问示例Q1为什么不建议在低基数列如性别建索引A低基数如性别只有男/女索引选择性差。查询WHERE gender男可能返回50%数据优化器会全表扫描而不是用索引。Q2BTree和B-Tree区别ABTree非叶子节点不存数据叶子节点存全部数据且双向链表更适合范围查询和顺序扫描。MySQL InnoDB使用BTree。Q3主键用UUID有什么问题AUUID随机无序插入时页分裂频繁写性能差且占用16字节二级索引叶子节点存储主键值空间浪费大。推荐自增整型/BigInt。Q4什么是索引下推ICPAMySQL 5.6优化。联合索引中存储引擎层先过滤可用的索引列减少回表次数。比如INDEX(a,c)查WHERE a1 AND c2先用c2过滤再回表。Q5一条查询同时有联合索引(a,b)和单列索引a优化器会选哪个A通常选(a,b)因为能覆盖更多条件。但优化器会基于代价估算IOCPU如果a列重复度高可能走单列。9. 总结对比表维度无索引有索引查询速度慢全表扫描快O(log N)写入速度快慢需维护索引磁盘占用低高额外空间维护成本无高索引选择、重建面试官想要的满分总结“索引本质上是排好序的BTree数据结构通过二分查找和树的高度压缩实现快速数据定位避免全表扫描。优点是查询效率极高缺点是占用磁盘、拖慢写操作。需掌握聚簇/二级索引区别、最左前缀原则、回表与覆盖索引并熟悉索引失效的典型场景函数、隐式转换、LIKE ‘%…’。生产建索引口诀等值查前置、区分度高的靠前、覆盖索引优化回表、写多读少谨慎加。”觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~