MySQL索引通过B+树等数据结构提升查询效率,类似书籍目录避免全表扫描。1. B+树所有数据存于叶子节点,非叶子节点仅存索引,降低磁盘I/O;2. 叶子节点用指针连接,支持高效范围查询;3. 树高通常2~3层,查找稳定快速。哈希索引适用于等值查询,不支持范围或排序。主键索引唯一非空,InnoDB中即聚簇索引;唯一索引保证值唯一,允一个NULL;普通索引无约束;组合索引遵循最左前缀原则,如(name, age)可命中name或name与age组合条件,单独age则失效。索引提高效率在于优化器选择索引后,经几次磁盘读取即可定位数据,减少扫描量。但索引过多增加存储和写开销,影响INSERT、UPDATE、DELETE性能。常见索引失效包括:对字段用函数如YEAR(create_time);字符串未加引号致隐式转换;使用!=或NOT IN;LIKE以%开头;组合索引不满足最左前缀。合理设计索引策略可显著提升数据库性能。

MySQL索引的核心作用是提升数据查询效率,它类似于书籍的目录,通过建立特定的数据结构,让数据库能快速定位到目标数据,避免全表扫描。
索引的基本数据结构
MySQL中最常见的索引类型使用的是B+树结构,尤其是在InnoDB存储引擎中。B+树是一种多路平衡搜索树,具有以下特点:
- 所有数据都存储在叶子节点,非叶子节点只存索引信息,有利于减少磁盘I/O
- 叶子节点之间通过指针连接,支持高效的范围查询(如 BETWEEN、>、
- 树的高度通常为2~3层,查找性能稳定,即使数据量大也能快速访问
索引的分类与应用场景
根据字段特性和使用方式,MySQL索引可分为多种类型:
- 主键索引(PRIMARY KEY):唯一且非空,每个表只能有一个,InnoDB中主键索引即聚簇索引
- 唯一索引(UNIQUE):保证字段值唯一,允许一个NULL值
- 普通索引(INDEX):最基本的索引类型,无约束限制
- 组合索引(Composite Index):多个字段联合创建的索引,遵循最左前缀原则
例如,对 (name, age) 建立组合索引,则查询条件包含 name 或 (name AND age) 可命中索引,但仅用 age 则无法使用。
索引如何提高查询效率
当执行一条SELECT语句时,优化器会判断是否可以使用索引。如果命中索引:
- 从B+树根节点开始逐层查找,经过几次磁盘读取即可到达叶子节点
- 直接获取到行记录的物理位置或主键值(二级索引需回表)
- 大幅减少需要扫描的数据页数量,提升响应速度
但索引并非越多越好。维护索引需要额外的存储空间和写入开销(INSERT、UPDATE、DELETE 都要更新索引),可能影响写性能。
索引失效的常见情况
即使建了索引,不当的SQL写法也会导致索引无法使用:
- 对字段使用函数或表达式,如 WHERE YEAR(create_time) = 2023
- 字符串字段查询未加引号,造成隐式类型转换
- 使用 != 或 NOT IN 等否定条件
- 模糊查询以通配符开头,如 LIKE '%abc'
- 组合索引未遵守最左前缀原则
基本上就这些。理解索引原理有助于写出高效SQL,合理设计表结构和索引策略能显著提升数据库性能。










