MySQL索引创建是数据库优化的核心手段,面试高频考点!掌握复合索引最左匹配原则、前缀索引优化技巧,避免冗余索引,提升查询性能。针对高频WHERE字段、JOIN关联字段、排序分组字段建立索引,注意区分度低的字段不适合建索引。通过EXPLAIN分析执行计划,验证索引效果。学习如何正确创建索引,优化SQL查询效率,解决慢查询问题,成为面试中的数据库优化专家!
作为程序员,面试被问“索引怎么建”的频率堪比被问“自我介绍”。今天结合真实面试场景,聊聊MySQL索引创建的核心要点,帮你避开踩坑姿势。
🔵 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g(覆盖分布式/并发/调优等热点题)
面试官常问:“什么时候该创建索引?” 我的回答分三层:
user_id、order_no这类总被查询的字段ON子句中的关联字段必加索引ORDER BY或GROUP BY的列,否则可能触发全表扫描💡 反面案例:某同事给
status字段(只有0/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=?(中间断层)对长文本字段(如varchar(255)),用前缀索引节省空间:
ALTER TABLE article ADD INDEX idx_title(title(20));
⚠️ 但要注意:前缀长度过短会降低区分度,建议先算选择性:
SELECT COUNT(DISTINCT LEFT(title,10))/COUNT(*) FROM article;
值越接近1,效果越好。
常见坑点:已有复合索引(a,b),又单独建(a)。此时后者就是冗余索引——InnoDB的B+树特性已经覆盖了单列查询。
-- 错误示范:索引失效
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';
涉及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+树结构:从左到右逐级定位数据
总结:索引创建是“空间换时间”的艺术。掌握最左匹配、前缀优化、避免冗余三大原则,面试官直呼内行! (关键词覆盖:索引创建|创建索引|复合索引|前缀索引|冗余索引)
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

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

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