Py学习  »  DATABASE

面试官:MySQL 的 MyISAM 和 InnoDB 索引结构都使用了 B+树,有什么区别呢?

脚本之家 • 4 月前 • 141 次点击  
脚本之家 设为“星标
第一时间收到文章更新
图片
来源 | 君哥聊技术(ID:gh_1f109b82d301)

MySQL 的 MyISAM 和 InnoDB 存储引擎使用的索引使用的都是 B+ 树,那有什么区别呢?今天来聊一聊这个话题。

首先我们创建一张表,SQL 如下

CREATE TABLE`t_user` (
`id`bigint(20NOTNULL AUTO_INCREMENT,
`name`varchar(16DEFAULTNULL,
`email`varchar( 32DEFAULTNULL,
`phone`varchar(11DEFAULTNULL,
  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+ 树,但索引结构完全不同,一个是聚集索引,一个是非聚集索引。

END

图片

  推荐阅读:
  1. 在Go中读取MySQL Date类型,一不小心就踩坑
  2. 面试官:MySQL 空值字段应该保存 NULL 还是默认值?
  3. 在MySQL中,是否可以使用UUID作为主键?
  4. 面试官:MySQL执行计划出现 Using  filesort 可能是什么原因?该怎样进行优化?

  5. MySQL 被干成老二了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190449