MySQL索引优化是程序员面试必考重点,掌握B+树索引、联合索引最左前缀原则、覆盖索引等核心技巧能大幅提升SQL性能。本文详解索引失效的6大陷阱,包括隐式类型转换、OR滥用、索引列运算等常见错误,并提供前缀索引、ORDER BY优化等实战解决方案。学习如何平衡读写性能,避免无效索引拖慢系统,附赠索引决策流程图和2025年最新Java面试宝典下载链接,助你轻松通过技术面试!访问面试鸭返利网还可享受会员专属优惠。
作为一名常年混迹面试场的老码农,我发现MySQL索引优化几乎是必考题!今天就用大白话聊聊核心策略,帮你避开面试官的连环陷阱。
索引相当于书的目录——没索引就是全表扫描(Full Table Scan),性能直接扑街。记住两个核心结构:
WHERE age > 18),叶子节点形成链表,范围查询效率碾压Hash索引WHERE id=123),但不支持范围查询,内存表慎用👉 高频面试题:为什么B+树比B树更适合数据库?
答案:B+树非叶子节点不存数据,单次IO能加载更多索引键;叶子节点双向链表,范围查询直接遍历,不用回溯到上层节点!
建了(name, age, city)索引?以下场景命中情况:
WHERE name='张三' ✅ 完美命中WHERE name='张三' AND age>22 ✅ 命中name+ageWHERE age=25 ❌ 直接索引失效(跳过了name)WHERE name='张三' ORDER BY city ✅ 索引覆盖排序划重点:设计联合索引时,高频查询字段放左侧!
WHERE phone=13800138000(phone是varchar)→ 全表扫描警告!WHERE YEAR(create_time)=2023 → 索引失效!改写成范围查询WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'WHERE a=1 OR b=2 → 改写成UNION拆分查询理想情况:查询字段全在索引中 → 无需回表
-- user表索引(name, age)
SELECT name, age FROM user WHERE name='Alice'; -- 直接索引返回,爽!
反面教材:
SELECT * FROM user WHERE name='Alice'; -- 查完索引还得回表找其他字段,血亏!
text/varchar(500)建索引?用前缀压缩:
ALTER TABLE article ADD INDEX idx_title_prefix(title(20)); -- 前20个字符建索引
平衡点:长度越长,区分度越高,但索引体积爆炸;建议用COUNT(DISTINCT LEFT(col,n))/COUNT(*)计算区分度
ORDER BY age DESC 没索引?文件排序(Using filesort)警告!
解决方案:
WHERE用name排序,直接建(name, age)联合索引LIMIT 100000,10 → 先用WHERE id > 100000定位无效索引危害比没索引更可怕:
INDEX(a,b)和INDEX(a)同时存在 → 后者多余SHOW INDEX FROM table_name;
SELECT * FROM sys.schema_unused_indexes; -- MySQL 5.7+
Q:索引是不是越多越好?
A:大错特错!每次INSERT/UPDATE都要维护索引,写操作直接变慢动作。建议单表索引数不超过5个!
Q:NULL值会不会进索引?
A:InnoDB中NULL也算一个索引值,但WHERE col IS NULL可能走索引也可能全表扫,看数据分布!
📌 程序员专属福利:需要面试鸭会员?通过面试鸭返利网(mianshiyafanli.com)找我下单,直接返现25元!
🔥 2025年Java面试宝典最新版:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g

LIKE通配符开火车:
WHERE name LIKE '%三' → 百分号打头,索引直接罢工!
✅ 救场方案:WHERE name LIKE '张%'(最左匹配生效)
索引列参与计算:
WHERE price+10 > 100 → 改写为WHERE price > 90
OR连接非索引字段:
WHERE indexed_col=1 OR non_indexed_col=2 → 强制转UNION ALL:
SELECT * FROM table WHERE indexed_col=1
UNION ALL
SELECT * FROM table WHERE non_indexed_col=2 AND indexed_col<>1
最后送大家一张索引优化决策图:

记住这组黄金公式:
高频查询 → 优先索引
写多读少 → 精简索引
长文本 → 前缀压缩
排序分组 → 联合索引覆盖
优化做得好,SQL跑得比兔子快! 🚀
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

美团大额优惠券,给自己加个鸡腿吧!

支付宝扫码领取1-8元无门槛红包
