2026-01-03 18:40:04
以下是针对 MySQL 索引相关面试问题的详细解答,涵盖索引类型、实现方式、优化技巧及失效场景等核心内容:
一、索引基础概念索引本质:数据库中的目录结构,通过存储字段值与数据位置的映射关系,加速数据检索效率。类比场景:类似字典目录,通过拼音/部首快速定位汉字页码,避免全本翻阅。
二、索引类型与实现方式1. 常见索引类型InnoDB 默认聚簇索引,每个表仅一个,字段值非空且唯一。
B+树叶子节点直接存储完整数据,无需回表。
允许字段值为 NULL,但整体值必须唯一。
适用于业务唯一性约束场景(如用户邮箱)。
无唯一性限制,适用于频繁查询但非唯一字段(如用户昵称)。
多字段组合索引(如 (name, age)),遵循最左匹配原则。
针对文本内容搜索(如文章内容),但索引体积大,维护成本高。
用于地理数据类型(如 POINT、POLYGON),需配合 SPATIAL 关键字使用。
支持范围查询、排序、模糊匹配,适合高并发读写场景。
仅支持等值查询,存在以下缺陷:
无法范围查询或排序
哈希冲突导致性能下降
每次查询需回表,无法利用覆盖索引

a = 1 AND b = 2 AND c = 3
a = 1 AND b = 2
b = 2 AND c = 3(缺少最左字段 a)
a = 1 AND c = 3(中间字段 b 缺失)
优化建议:
计算区分度:
SELECT COUNT(DISTINCT LEFT(name, 4)) / COUNT(*) FROM user;根据结果选择前缀长度(如区分度达99%时,使用 name(4))。
优势:减少索引存储空间,提升写入性能。
四、索引失效场景使用 EXPLAIN 分析查询计划,确认是否走索引。
每个表索引建议不超过5个,避免写入性能下降。
使用前缀索引或倒序存储(如 LIKE '%傲天' 改为存储反向字段)。
避免超过3个表连接,可通过冗余字段优化。
保证 B+ 树有序插入,减少页分裂。
占用空间小(推荐 INT UNSIGNED 或 BIGINT),降低二级索引存储成本。
无序插入导致频繁页分裂,影响写入性能。
主键长度过大时,二级索引叶子节点需存储更多主键值,增加存储开销。

通过以上内容,可系统化掌握 MySQL 索引的核心知识点,从容应对面试中的相关问题。实际工作中需结合业务场景灵活应用,避免过度索引或设计缺陷。