MySQL索引的实现方式与存储引擎密切相关,不同存储引擎对索引类型的支持能力也存在差异。通常来说,MySQL索引类型可以从三个维度进行区分:第一是物理存储结构,例如聚簇索引与非聚簇索引;第二是逻辑约束类型,比如主键索引、唯一索引、普通索引;第三是实际应用特性,如全文索引、空间索引等。这样的分类方法,能够更全面地体现数据库索引在数据组织、约束控制和查询优化中的多重作用。

一、物理存储结构
MySQL索引按照物理存储结构,主要可以分为B-树索引和哈希索引两大类:
1. B-树索引(BTREE索引)
B-树索引采用多层树形结构进行存储,通常由根节点、分支节点和叶子节点组成。根节点是整棵索引树的唯一入口,分支节点负责指向下一层节点或叶子节点,用于快速定位数据,而叶子节点则保存与数据表记录相关的索引信息,并通过指针连接形成有序链表。正因为叶子节点具备有序性,所以B-树索引能够很好地支持范围查询、全值匹配、前缀匹配以及排序操作。不过,在使用复合索引时,必须遵循最左前缀原则,具体包括以下几点:
1.1必须遵循最左前缀原则:
1.2查询必须从索引最左列开始
1.3不能跳过索引中的任何列
1.4范围查询后的列无法用于索引过滤
2. 哈希索引(HASH索引)
这类索引更适合需要高效精确匹配的场景,而不适用于范围查询和排序操作,并非InnoDB、MyISAM等引擎的默认索引类型。
哈希索引通过哈希算法将索引值转换为哈希码后直接定位数据,因此通常只支持等值查询,如 =、IN,不支持范围查询、排序以及部分列匹配。其查询效率理论上接近O(1),但更适合精准查找的业务场景。目前,只有MEMORY/HEAP存储引擎原生支持哈希索引,并且它也是MEMORY引擎的默认索引类型。
核心区别:B-树索引功能更全面,适用于大多数通用数据库查询和事务处理场景;哈希索引则更适合内存表中的高频精确匹配查询。
二、逻辑约束类型
从逻辑约束角度来看,MySQL索引主要可分为以下五类。不同类型的索引通过各自的约束机制,在保证数据完整性的同时提升查询性能:
1. 普通索引(INDEX)
约束特性:不附带任何数据唯一性约束,主要作用是提升查询速度
允许值:可包含重复值和NULL值
创建关键字:INDEX 或 KEY
适用场景:常见查询优化场景,适用于没有唯一性要求的字段
CREATE INDEX index_name ON table_name(column_name);
2. 唯一索引(UNIQUE)
约束特性:用于保证字段值唯一,禁止出现重复数据
允许值:允许NULL值(但仅能出现一次)
创建关键字:UNIQUE
适用场景:适合防止数据重复,例如身份证号、邮箱地址等字段
CREATE UNIQUE INDEX index_name ON table_name(column_name);
3. 主键索引(PRIMARY KEY)
约束特性:属于特殊的唯一索引,要求字段值既唯一又不能为空
允许值:禁止NULL值和重复值
创建关键字:PRIMARY KEY
特殊要求:每张表只能有一个主键,在InnoDB中主键索引通常表现为聚簇索引
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
4. 空间索引(SPATIAL)
约束特性:专门用于空间数据类型的地理信息索引
允许值:禁止NULL值(字段必须定义为NOT NULL)
创建关键字:SPATIAL
引擎限制:仅MyISAM引擎支持
数据类型:通常适用于GEOMETRY等空间数据类型
CREATE SPATIAL INDEX index_name ON table_name(column_name);
5. 全文索引(FULLTEXT)
约束特性:专门用于文本内容的关键词检索和全文搜索
允许值:允许重复值和NULL值
创建关键字:FULLTEXT
引擎限制:MyISAM和InnoDB(5.6+)支持
数据类型:仅适用于CHAR、VARCHAR、TEXT类型
CREATE FULLTEXT INDEX index_name ON table_name(column_name);
三、实际应用类型
从实际应用场景来看,MySQL索引通常可分为单列索引和多列索引两类,它们分别适用于不同的SQL查询需求和数据库性能优化方案:
1. 单列索引(Single-Column Index)
定义:仅基于数据表中的单个字段创建的索引
索引类型:可以是普通索引、唯一索引、主键索引或全文索引
适用场景:
1.1查询条件中仅涉及单个字段的筛选
1.2需要对单个字段进行快速排序或分组
1.3字段重复度较低且查询频率较高的情况
优势:创建和维护成本较低,查询优化器更容易选择使用,尤其适合单字段的精确匹配查询。
CREATE INDEX index_addr ON tb_student(address(4)); -- 创建单列前缀索引(只索引前4个字符)
2. 多列索引(复合索引/组合索引)
定义:基于表中多个字段联合创建的索引
索引结构:索引键值会按照定义时的字段顺序进行组织和存储
核心特性:最左前缀匹配原则
查询必须从索引最左字段开始
可以匹配索引的前缀子集(如索引(a,b,c)可支持a、a,b查询)
不能跳过中间字段进行匹配
适用场景:
2.1多条件联合查询(WHERE条件包含多个字段)
2.2多字段排序或分组(ORDER BY/GROUP BY多个字段)
2.3覆盖索引查询(索引包含所有查询字段)
优势:能够减少索引数量,降低存储空间开销,提升多条件查询执行效率,并可通过覆盖索引减少回表操作。
CREATE INDEX index_na ON tb_student(name, address); -- 创建name和address字段的组合索引
