MySQL索引创建——面试官最爱考的优化手段
作为程序员,面试被问“索引怎么建”的频率堪比被问“自我介绍”。今天结合真实面试场景,聊聊MySQL索引创建的核心要点,帮你避开踩坑姿势。
📁 2025年Java面试高频题宝典
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g(覆盖分布式/并发/调优等热点题)
🔍 一、索引创建的核心场景
面试官常问:“什么时候该创建索引?” 我的回答分三层:
- 高频WHERE字段:比如
user_id、order_no这类总被查询的字段 - 连接优化字段:JOIN操作时
ON子句中的关联字段必加索引 - 排序分组字段:
ORDER BY或GROUP BY的列,否则可能触发全表扫描
💡 反面案例:某同事给
status字段(只有0/1两种值)建索引,反而降低写入性能——这就是典型的无效索引创建!
🛠 二、索引创建的正确姿势
1. 复合索引的"最左匹配"原则
当面试官问:“复合索引(a,b,c)能加速WHERE b=?吗?” 果断回答:不能!
✅ 有效场景:
WHERE a=?(命中a)WHERE a=? AND b=?(命中a,b)WHERE a=? AND b=? AND c=?(全命中)
❌ 失效场景:
WHERE b=?(未从最左开始)WHERE a=? AND c=?(中间断层)
2. 前缀索引的取舍
对长文本字段(如varchar(255)),用前缀索引节省空间:
ALTER TABLE article ADD INDEX idx_title(title(20));
⚠️ 但要注意:前缀长度过短会降低区分度,建议先算选择性:
SELECT COUNT(DISTINCT LEFT(title,10))/COUNT(*) FROM article;
值越接近1,效果越好。
3. 避免冗余索引
常见坑点:已有复合索引(a,b),又单独建(a)。此时后者就是冗余索引——InnoDB的B+树特性已经覆盖了单列查询。
🧩 三、索引创建注意事项
1. 不是所有字段都适合建索引
- 低区分度字段:如性别、状态标志(值小于5种)
- 高频更新的字段:每次更新连带更新索引,消耗IO
- 大文本字段:用全文索引替代B-Tree索引
2. 谨慎使用函数索引
-- 错误示范:索引失效
SELECT * FROM orders WHERE YEAR(create_time)=2023;
✅ 优化方案:
ALTER TABLE orders ADD INDEX idx_create_time(create_time);
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
3. 空间索引的特殊性
涉及GIS数据(如地图坐标),用SPATIAL INDEX:
CREATE SPATIAL INDEX idx_location ON addresses(location);
💡 面试加分回答
当问到“索引创建后如何验证效果?” 可以这样答:
- 用
EXPLAIN查看执行计划- 关注
type列:出现index或range说明索引生效
- 关注
- 对比查询耗时
SELECT SQL_NO_CACHE ...排除缓存干扰
- 监控索引使用率
SELECT * FROM sys.schema_index_statistics WHERE table_name='orders';
🎁 附:省会员费小技巧
如果需要购买面试鸭会员,通过 面试鸭返利网 找我可返利25元(官网原价基础上立减)。用省下的钱多喝两杯咖啡,刷题更带劲~
复合索引的B+树结构:从左到右逐级定位数据
总结:索引创建是“空间换时间”的艺术。掌握最左匹配、前缀优化、避免冗余三大原则,面试官直呼内行! (关键词覆盖:索引创建|创建索引|复合索引|前缀索引|冗余索引)



