请移步至 【DobbyKim 的每日一题】 查看更多的题目~
本文章为【极客时间】课程【MySQL 实战 45 讲】的内容整理
在 MySQL 中,索引是在存储引擎层实现的(事务也是在存储引擎层实现的)。所以,不同的存储引擎的索引工作方式并不相同。
MySQL 数据库使用最为广泛的两个存储引擎: InnoDB 与 MyISAM 索引都是通过 B+ 树来实现的,但是二者在管理数据的方式上却是不同的,我们来认识一下这两种存储引擎的索引模型:
InnoDB 的索引模型
在 InnoDB 中,表是根据主键顺序以索引的形式存放的,每一个索引在 InnoDB 里面对应一棵 B+ 树。
例如,我们有一个主键列为 ID 的表,表中有字段 k,并且在 k 上有索引。
该表的建表语句为:
create table T(
id int primary key,
k int not null,
name varchar(16),
index (k)
)engine=InnoDB;
表中 R1~R5 的 (ID,k) 值分别为:(100,1),(200,2),(300,3),(500,5) 和 (600,6),主键索引与普通索引 k 的索引树示意图如下:
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 可以重复。