本文章为【极客时间】课程【MySQL 实战 45 讲】的内容整理

在 MySQL 中,索引是在存储引擎层实现的(事务也是在存储引擎层实现的)。所以,不同的存储引擎的索引工作方式并不相同。

MySQL 数据库使用最为广泛的两个存储引擎: InnoDB 与 MyISAM 索引都是通过 B+ 树来实现的,但是二者在管理数据的方式上却是不同的。

InnoDB 的索引模型

在 InnoDB 中,表是根据主键顺序以索引的形式存放的,每一个索引在 InnoDB 里面对应一棵 B+ 树。

例如,我们有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引。

该表的建表语句为:

  1. create table T(
  2. id int primary key,
  3. k int not null,
  4. name varchar(16),
  5. index (k)
  6. )engine=InnoDB;

表中 R1~R5 的 (ID,k) 值分别为:(100,1),(200,2),(300,3),(500,5) 和 (600,6),主键索引与普通索引 k 的索引树示意图如下:

image.png

InnoDB 的主键索引是聚簇索引(clustered index),叶子节点存放的是 Page(页),也就是说数据文件和主键索引是绑在一起的;而非主键索引的叶子节点内容是主键的值,非主键索引也被成为二级索引(secondary index)。

那么,基于 InnoDB 引擎的主键索引查询和普通索引查询有什么区别呢?

如果语句为:select * from T where ID = 500; 即使用主键索引进行查询,则只需要搜索主键索引这棵 B+ 树;如果语句为:select * from T where k = 5; 即使用普通索引进行查询,那么就需要先搜索二级索引 k 的 B + 树,得到 ID 的值为 500,然后再到主键索引树搜索一次,这个过程称之为回表。也就是说使用主键索引查询只需要查询一次,而使用普通索引查询则需要两次。

MyISAM 索引模型

MyISAM 和 InnoDB 不同,MyISAM 的索引方式也叫做非聚簇索引,索引和数据文件是分离的,索引树的叶节点存放的是数据记录的地址。MyISAM的主键索引(Primary Key)与辅助索引(Secondary key)在结构上没有任何区别,只是主键索引要求 key 是唯一的,而辅助索引的 key 可以重复。

image.png