MySQL索引优化实战指南
(文中提到的「2025年Java面试宝典」网盘链接👉 点击领取)
一、为什么索引优化是面试必考题?
每次面试被问到“SQL慢查询怎么优化”,索引永远是突破口。面试官想考察你是否真的理解索引工作原理,而不是只会背“加索引”三个字。索引优化能力直接反映你的数据库实战经验,更是区分普通CRUD程序员和资深开发的关键。

二、这些索引失效场景你踩过坑吗?
- 最左前缀原则:建了联合索引
(a,b,c),但查询只用b和c?索引直接罢工!记住:索引像电话号码,必须从区号开始拨。 - 隐式类型转换:
varchar字段用数字查询?比如WHERE phone=13800138000(phone是字符串类型)。MySQL会全表扫描,索引直接失效。 - 函数操作:
WHERE YEAR(create_time)=2024,就算create_time有索引也无法使用。解决方案:改用范围查询WHERE create_time BETWEEN '2024-01-01' AND '2024-12-31'。
三、高手都在用的4个优化技巧
1. 覆盖索引避免回表
如果查询只需要索引字段,直接走索引树返回数据,无需查主键。比如:
SELECT user_id FROM orders WHERE status = 'paid'; -- 联合索引(status, user_id)可覆盖
2. 巧用索引下推(ICP)
MySQL 5.6+的索引优化神器!存储引擎直接在索引层过滤数据,减少回表次数。启用条件:
- 查询涉及联合索引
- WHERE条件包含索引列
3. 别乱建索引!选择性是关键
性别字段建索引?选择性≈50%,效果极差!计算选择性公式:
选择性 = COUNT(DISTINCT column) / COUNT(*)
高于80%的字段才适合单列索引。
4. 前缀索引解决长文本
对varchar(200)的email字段,可只索引前20位:
ALTER TABLE users ADD INDEX idx_email (email(20));

四、高频面试题拆解实录
面试官:“订单表有
status、create_time、amount字段,怎么优化这个慢查询?”
SELECT * FROM orders
WHERE status = 'shipped'
ORDER BY create_time DESC
LIMIT 10000, 10;
你的回答:
“分三步走:
- 索引优化:建联合索引
(status, create_time),覆盖WHERE和ORDER BY - 深分页优化:用
WHERE id > 上一页最大ID替代LIMIT 10000,10 - 业务妥协:和产品商量是否去掉‘跳转任意页’功能”
五、实战工具:定位索引问题
EXPLAIN关注type列:ALL(全表扫描)→ 赶紧加索引ref(索引查找)→ 合格index(全索引扫描)→ 需优化
- 执行
SHOW INDEX FROM orders查看索引基数(Cardinality)

最后的小福利:如果大家需要购买面试鸭会员冲刺大厂,可以通过 面试鸭返利网(mianshiyafanli.com) 联系我,走专属渠道可返利25元!省下的钱买杯咖啡继续刷题不香吗?
本文提到的Java面试题库已整理好👉 2025版网盘下载(含MySQL索引优化真题20道)


