MySQL 的索引类型有哪些?

Sherwin.Wei Lv7

MySQL 的索引类型有哪些?

回答重点

数据结构角度来看,MySQL 索引可以分为以下几类:

  • B+树索引
  • 哈希索引
  • 倒排索引(即全文索引 Full-Text)
  • R-树索引(多维空间树)

常见的基于 InnoDB B+ 树索引角度来看,可以分为:

  • 聚簇索引(Clustered Index)
  • 非聚簇索引(Non-clustered Index)

索引性质的角度来看,可以分为:

  • 普通索引(二级索引、辅助索引)
  • 主键索引
  • 联合索引
  • 唯一索引
  • 全文索引
  • 空间索引

扩展知识

进一步分析基于数据结构的索引分类

  • B+树索引:通过树形结构存储数据,适用于范围查询(如 BETWEEN)和精确查询(如 =),支持有序数据的快速查找、排序和聚合操作。是 MySQL 默认的索引类型,常用于 InnoDBMyISAM 引擎。
  • 哈希索引:基于哈希表的结构,适用于等值查询(如 =),查询速度非常快,但不支持范围查询(如 ><)。哈希索引不存储数据的顺序,常用于 Memory 引擎。
  • 倒排索引(Full-Text):用于全文搜索,将全文分词,通过存储词与文档的映射,支持模糊匹配和关键字搜索。特别适合用于大文本字段,如 TEXT 类型的列,用于查找包含特定词语的记录。
  • R-树索引:专为多维空间数据(如地理坐标)设计,适用于空间查询(例如,计算地理位置的最近距离、区域查询等)。常用于存储和查询地理信息系统(GIS)中的空间数据。

进一步分析基于 InnoDB B+ 树索引分类

  • 聚簇索引:InnoDB 中主键索引就是聚簇索引。它基于主键排序存储。之所以叫聚簇索引是因为索引的叶子节点存储完整数据行数据
  • 非聚簇索引:指的是 InnoDB 中非主键索引的索引,之所以称之为非聚簇是因为这个索引的叶子节点仅保存索引字段和主键的值。如果要查询完整的数据行中的数据,需要再从聚簇索引即主键索引中通过主键查询,一个表可以有多个非聚簇索引。

进一步分析基于索引性质的分类

  • 普通索引:一般指非主键索引且非唯一索引。
  • 主键索引:表中的每一行数据都有唯一的主键。每个表只能有一个主键索引,且主键值不能为 NULL。InnoDB 中主键索引是聚簇索引结构实现的。
  • 联合索引:由多个列组成的索引,适用于多列的查询条件,能够提高包含多个条件的查询的性能。联合索引中的列是按照指定顺序排列的。
  • 唯一索引:保证索引列中的值是唯一的,可以有效防止重复数据的插入。唯一索引允许 NULL 值,但一个列中可以有多个 NULL
  • 全文索引:用于全文搜索,支持对长文本字段(如 TEXT 类型)进行关键字查找,支持自然语言处理、模糊匹配等操作。适用于需要对文本内容进行复杂搜索的场景。
  • 空间索引:用于空间数据(如地图上的经纬度坐标等)查询。通常使用 R-树结构,适合多维数据的查询,如区域查询和最近距离查询,主要用于 MyISAMInnoDB 存储引擎中的地理信息数据。

索引建立 SQL 示例

主键索引

1
2
3
4
5
6
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(50),
PRIMARY KEY(id)
);

唯一索引

1
CREATE UNIQUE INDEX idx_username ON users(username);

普通索引

1
CREATE INDEX idx_username ON users(username);

全文索引

1
CREATE FULLTEXT INDEX idx_content ON articles(content);

联合索引

1
CREATE INDEX idx_username_email ON users(username, email);

哈希索引

1
CREATE INDEX idx_username_hash ON users(username) USING HASH;

空间索引

1
CREATE SPATIAL INDEX idx_location ON places(location);
Comments