MySQL中索引的实现与存储引擎密切相关,不同引擎对索引类型的支持存在差异性。通常可以从三个层面来划分索引类别:物理存储结构(如聚簇与非聚簇索引)、逻辑约束类型(如主键、唯一、普通索引)以及实际应用特性(如全文索引、空间索引等)。这种分类方式体现了索引在数据组织、约束保障和功能特性上的多维特征。
一、物理存储结构
MySQL索引按物理存储结构分为B-树索引和哈希索引两类:
1. B-树索引(BTREE索引)
采用多层级树形结构存储,包含根节点(索引树的顶层节点,唯一入口)、分支节点(指向下层节点或叶子节点,用于路由定位)和叶子节点(直接指向数据表中的行记录,且节点间通过指针串联形成有序链表)。叶子节点直接指向数据行并形成有序链表,支持范围查询、全键值匹配、前缀查询和排序操作,但必须遵循最左前缀原则,具体表现为:
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索引可分为单列索引和多列索引两类,分别适用于不同的查询场景和性能优化需求:
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字段的组合索引
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程