2025年Java面试宝典下载地址(提取码:9b3g)
一、MySQL索引的底层原理
MySQL索引最常用的B+树结构,由三层组成:根节点、中间节点和叶子节点。叶子节点存储实际数据,并通过双向链表连接,支持快速范围查询。B+树的高度通常控制在3-4层,意味着查询10亿级数据只需3次磁盘IO。

与哈希索引相比,B+树支持范围查询和排序操作。哈希索引虽然O(1)时间复杂度查询,但无法处理>、<等范围查询,这是B+树成为主流索引结构的关键原因。
二、索引类型与选择策略
1. 主键索引与非主键索引
主键索引叶子节点存储整行数据,而非主键索引(二级索引)叶子节点存储主键值。这解释了为什么建议使用覆盖索引:当查询字段都在索引中时,可以直接从索引树获取数据,避免回表操作。
2. 组合索引最左匹配原则
建立(name,age)的联合索引时:
- 能生效的查询:
where name='张三'、where name='李四' and age>20 - 不生效的查询:
where age=25、where name like '%张%'

3. 前缀索引使用场景
对于长文本字段(如地址),可使用alter table user add index idx_addr(address(10))创建前缀索引。需注意区分度评估,通过select count(distinct left(address,10))/count(*)计算选择性。
三、索引失效的六大陷阱
- 隐式类型转换:
where phone=13800138000(phone是varchar类型) - 函数操作:
where date_format(create_time,'%Y-%m')='2024-01' - 前导通配符:
where name like '%张三%' - OR连接非索引字段:
where age=20 or address='北京'(address无索引) - 不符合最左前缀:联合索引(name,age)下使用
where age>18 - 索引列参与运算:
where id+1=100
四、索引优化核心方法论
1. 三星索引原则
- 一星:where条件匹配索引列
- 二星:order by排序使用索引
- 三星:select字段被索引覆盖
2. 索引下推(ICP)
MySQL5.6引入的特性,在存储引擎层过滤数据。例如联合索引(name,age)查询:
select * from user
where name like '张%' and age>20
存储引擎会先按name筛选,再过滤age>20的记录,减少回表次数。

3. 索引监控手段
通过explain查看执行计划时重点关注:
- type列:至少达到range级别
- key_len:实际使用的索引长度
- Extra列:是否出现Using filesort、Using temporary
五、高频面试题精讲
面试官问:为什么建议用自增主键? 答:自增主键保证插入数据时,新记录总是追加到B+树末尾,避免页分裂。如果是随机主键(如UUID),可能造成频繁的页分裂和空间碎片。
面试官问:如何判断是否需要加索引?
答:通过慢查询日志定位高频慢SQL,使用show index from table查看基数(cardinality)。当基数/总行数 > 10%时,该字段适合建索引。
需要购买《面试鸭》会员的同学,通过面试鸭返利网找我可返利25元。本文涉及的更多索引优化技巧,可在开头的网盘链接下载完整面试宝典。


