资讯动态

Java面试MySQL索引,这4个问题必问

发布时间:2026/9/29 15:10:32 来源:尧图企业网站定制
MySQL索引是Java后端面试的必考项无论是初级还是高级岗位面试官总会围绕索引展开追问。原因很简单索引直接决定了数据库查询性能而性能问题往往是线上事故的第一杀手。如果你只会说“加索引就快了”那大概率撑不过第二轮。以下4个问题几乎每场面试都会出现建议逐条吃透。问题一为什么MySQL用B树而不是B树或哈希这是索引的“第一问”考察你对数据结构的理解。哈希索引虽然等值查询是O(1)但它不支持范围查询也无法利用最左前缀原则且哈希冲突严重时性能骤降。B树每个节点既存键又存数据导致单节点能存储的键数量少树的高度更高磁盘IO次数更多。而B树做了两个关键优化非叶子节点只存键不存数据因此单节点能容纳更多键树更矮更胖通常三层就能支撑千万级数据所有数据都在叶子节点且叶子节点用双向链表连接范围查询和排序只需顺序扫描链表效率极高。面试时还可以补一句InnoDB的B树叶子节点存储的是完整行数据聚簇索引而MyISAM存储的是数据地址这也是两者的核心区别。问题二聚簇索引和非聚簇索引有什么区别这个问题考察你对InnoDB存储结构的理解。聚簇索引叶子节点直接存储整行数据。InnoDB的主键索引就是聚簇索引一张表只能有一个。它的优点是主键查询极快因为一次B树查找就能拿到数据。缺点是插入顺序依赖主键如果主键无序如UUID会导致页分裂和碎片影响性能。非聚簇索引二级索引叶子节点存储的是索引列的值和主键值。通过二级索引查询时先找到主键再回聚簇索引查完整数据这个过程叫回表。回表会增加一次B树查找是性能损耗的主要来源。由此引出覆盖索引如果查询的列全部包含在二级索引中就无需回表直接返回。比如在(name, age)上建索引查询SELECT name, age FROM user WHERE name 张三就能走覆盖索引。面试中能主动提到覆盖索引是加分项。问题三最左前缀原则是什么哪些情况会导致索引失效这是实战中最常踩坑的地方。最左前缀原则指联合索引(a, b, c)查询条件必须从最左列开始连续匹配才能利用索引。WHERE a 1 AND b 2可以走索引WHERE b 2不行WHERE a 1 AND c 3只能用到a列。范围查询会中断后续列的使用比如WHERE a 1 AND b 2 AND c 3c列无法走索引。索引失效的常见场景包括在索引列上做函数运算或类型转换如WHERE YEAR(create_time) 2024使用LIKE %abc以通配符开头使用OR连接非索引列使用!或NOT IN导致优化器放弃索引以及隐式类型转换比如字符串列用数字查询。面试时最好结合EXPLAIN解释查看type列ref、range、index、ALL、key列实际使用的索引、rows列预估扫描行数和Extra列Using index表示覆盖索引Using filesort表示额外排序。问题四如何判断索引是否合理有哪些优化策略这个问题考察你的工程判断力。首先索引不是越多越好。每个索引都会占用磁盘空间并降低写入性能因为INSERT、UPDATE、DELETE都要维护索引。一般单表索引不超过5个。优化策略包括区分度高的列优先建索引比如性别区分度低不适合单独建索引联合索引把等值查询列放前面范围查询列放后面利用覆盖索引减少回表避免冗余索引如已有(a, b)再建(a)就是浪费定期用SHOW INDEX和sys.schema_unused_indexes清理无用索引对于长字符串使用前缀索引如INDEX(email(20))但要注意区分度。最后可以提一句索引优化不是一劳永逸的随着数据分布变化执行计划可能改变需要持续监控慢查询日志。总结MySQL索引面试题看似零散实则围绕“数据结构—存储方式—查询规则—工程实践”四条主线。能把这4个问题讲清楚不仅证明你背过八股更说明你理解数据库的运行逻辑。建议在本地用EXPLAIN反复验证把理论变成手感面试时才能对答如流。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑