MySQL 的索引机制

🎯 什么是索引?

索引是数据库中一种用于提高查询效率的数据结构,类似于书籍的目录。通过索引,MySQL 可以快速定位到目标数据,而不需要全表扫描。

✅ MySQL 中的索引类型(常见)

类型名称说明
主键索引唯一标识一条记录,不能为 NULL,自动创建为聚簇索引
唯一索引唯一性约束,不允许重复值,但允许 NULL
普通索引最基本的索引类型,没有唯一性要求
联合索引多列组成的复合索引,遵循“最左前缀”原则
全文索引支持全文检索,适合英文文本
空间索引用于 GIS 空间数据,如点、面,基于 R-Tree 实现


✅ MySQL 索引底层实现机制

默认存储引擎 InnoDB 下,索引通常基于 B+ 树(B+Tree) 结构实现。

✅ 聚簇索引(Clustered Index)
  • InnoDB 的主键索引就是聚簇索引。

  • 数据和索引存储在同一棵 B+ 树的叶子节点。

  • 所以表中只能有一个聚簇索引。

✅ 二级索引(Secondary Index)
  • 非主键的索引都是二级索引。

  • 叶子节点存储的是主键值,通过主键再去回表查询数据(“回表”)。


✅ B+ 树索引的特点

  • 所有值都存在叶子节点,中间节点只做导航。

  • 每个节点能存储大量数据页,降低树的高度,提高检索效率。

  • 查询是从根节点开始,逐层向下,最终到叶子节点,时间复杂度约为 O(logₙN)


⚠️ 最左前缀原则(联合索引重点)

对联合索引如 (a, b, c),支持以下查询:

  • WHERE a=...

  • WHERE a=... AND b=...

  • WHERE b=... ❌ 不走索引(不满足最左前缀)


✅ 索引的优点

  1. 提高查询效率,降低 IO 次数(特别是大表)

  2. 加快排序、分组、连接等操作

  3. 可以约束数据唯一性(如唯一索引)


❌ 索引的缺点

  1. 占用额外的磁盘空间

  2. 影响写入性能(增删改时需要维护索引)

  3. 滥用或冗余索引会导致优化器选择错误路径


🧠 面试加分点(你说出来就赢了)

  • 索引失效情况(会导致全表扫描):

    • 使用 LIKE '%abc' 前缀通配符

    • 在索引列上做运算(如 WHERE age+1 = 30

    • 隐式类型转换(如字符串和整型比较)

    • 不遵守最左前缀原则

  • 覆盖索引(Covering Index)

    • 查询的字段都在索引中,避免回表,提高性能

    • EXPLAIN 中出现 Using index

  • 避免使用冗余索引与重复索引

    • 索引数量要精简,一个查询只会选择最优的一个索引路径


🧠 记忆口诀:索引五字诀

“左、树、聚、回、失”

口诀含义
最左前缀原则
底层数据结构是 B+ 树
聚簇索引与主键绑定
二级索引需回表查询主键数据
索引失效情况要牢记


✅ 一句话收尾总结(面试用):

MySQL 索引基于 B+ 树结构设计,默认使用聚簇索引优化数据存储和访问。在开发中应根据业务查询场景合理创建联合索引,理解最左前缀原则和索引失效场景,从而最大化利用索引带来的性能收益。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值