索引原理与优化
索引的基本概念
什么是索引?
没有索引:从第一页开始翻,直到找到目标内容(全表扫描)
有索引:先查目录,直接定位到目标页码(索引查找)为什么需要索引?
-- 没有索引
SELECT * FROM users WHERE phone = '13800138000';
-- 全表扫描:扫描 1000 万行,耗时数秒甚至数分钟
-- 有索引
SELECT * FROM users WHERE phone = '13800138000';
-- 索引查找:定位到几行数据,耗时毫秒级索引的代价
优点
代价
索引数据结构 ⭐⭐⭐⭐⭐
B+ Tree 索引
B+ Tree 的结构
B+ Tree 的特点
特点
说明
为什么选择 B+ Tree?⭐⭐⭐⭐⭐
B+ Tree 索引的查找过程
一页能存多少数据?
Hash 索引
Hash 索引的特点
使用场景
场景
是否适合 Hash 索引
InnoDB 中的 Hash
索引类型
主键索引(Primary Key)⭐⭐⭐⭐⭐
方案
优点
缺点
唯一索引(Unique Index)
特性
唯一索引
普通索引
普通索引(Normal Index)
全文索引(Full-Text Index)
组合索引(Composite Index)⭐⭐⭐⭐⭐
最左前缀原则 ⭐⭐⭐⭐⭐
索引下推(Index Condition Pushdown, ICP)
聚簇索引与非聚簇索引 ⭐⭐⭐⭐⭐
聚簇索引(Clustered Index)
特点
说明
非聚簇索引(Secondary Index / 二级索引)
回表查询 ⭐⭐⭐⭐⭐
覆盖索引 ⭐⭐⭐⭐⭐
索引结构对比总结
特性
聚簇索引
非聚簇索引
索引优化 ⭐⭐⭐⭐⭐
索引失效场景
1. 对索引列使用函数或表达式
2. 隐式类型转换
3. 前导模糊查询
4. OR 条件(部分列无索引)
5. 不等于条件
6. IS NULL / IS NOT NULL
7. 联合索引不满足最左前缀
索引设计原则
1. 选择性高的列建索引
2. 考虑查询频率和方式
3. 避免冗余索引
4. 考虑索引的维护成本
5. 使用前缀索引
6. 利用覆盖索引
索引优化实战示例
执行计划分析 ⭐⭐⭐⭐⭐
EXPLAIN 基础用法
EXPLAIN 输出字段详解
id - 查询序列号
select_type - 查询类型
值
含义
type - 访问类型 ⭐⭐⭐⭐⭐
key_len - 索引长度
rows - 预估扫描行数
Extra - 额外信息 ⭐⭐⭐⭐
值
含义
说明
执行计划分析实战
面试高频问题 ⭐⭐⭐⭐⭐
Q1: 为什么 MySQL 选择 B+ Tree 作为索引结构?
Q2: 什么是聚簇索引和非聚簇索引?
特性
聚簇索引
非聚簇索引
Q3: 什么是回表?如何避免?
Q4: 什么是最左前缀原则?
Q5: 索引失效的常见场景有哪些?
Q6: 如何选择合适的索引?
Q7: EXPLAIN 中哪些情况需要优化?
问题
表现
优化方向
Q8: 自增主键有什么优势?
Q9: 什么是索引下推(ICP)?
Q10: 前缀索引有什么限制?
总结
核心要点 ⭐⭐⭐⭐⭐
记住这些关键点
Last updated