来源 | 君哥聊技术(ID:gh_1f109b82d301)MySQL 的 MyISAM 和 InnoDB 存储引擎使用的索引使用的都是 B+ 树,那有什么区别呢?今天来聊一聊这个话题。
首先我们创建一张表,SQL 如下:
CREATE TABLE`t_user` (
`id`bigint(20) NOTNULL AUTO_INCREMENT,
`name`varchar(16) DEFAULTNULL,
`email`varchar(
32) DEFAULTNULL,
`phone`varchar(11) DEFAULTNULL,
PRIMARY KEY (`id`),
KEY`k_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3DEFAULTCHARSET=latin1
除了主键 id 外,在 name 字段上加了普通索引,插入 6 条数据:

1.MyISAM
MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的存储地址。
1.1 主键索引
MyISAM 存储引擎使用的是 B+ 树索引,B+ 树上面非叶子节点保存索引值,叶子节点则保存了主键值+数据地址。
叶子节点不保存数据,这种索引方式叫做非集索引。

1.2 非主键索引
主键索引和非主键索引在索引结构上是完全一样的,唯一的不同就是非主键索引值可以重复。下面我们看一下 k_name 这个索引的结构:

2.InnoDB
跟 MyISAM 不同的是,InnoDB 是按照 B+ 树组织的聚集索引,主键索引的叶节点保存了主键和完整的数据记录。所以 InnoDB 数据文件本身就是索引文件。
2.1 主键索引
InnoDB 主键索引 key 值保存主键值,数据域则保存了完整的行记录。如下图:
2.2 非主键索引
InnoDB 普通索引 key 值保存索引值,数据域则保存了主键值,查询的时候需要回表查询。如下图:

3.总结
虽然 MyISAM 和 InnoDB 存储引擎使用的索引都是 B+ 树,但索引结构完全不同,一个是聚集索引,一个是非聚集索引。