君哥聊技术

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

大家好,我是君哥。

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

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

CREATETABLE`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 条数据:

Image

1.MyISAM

MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的存储地址。

1.1 主键索引

MyISAM 存储引擎使用的是 B+ 树索引,B+ 树上面非叶子节点保存索引值,叶子节点则保存了主键值+数据地址。叶子节点不保存数据,这种索引方式叫做非集索引。

Image

1.2 非主键索引

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

Image

2.InnoDB

跟 MyISAM 不同的是,InnoDB 是按照 B+ 树组织的聚集索引,主键索引的叶节点保存了主键和完整的数据记录。所以 InnoDB 数据文件本身就是索引文件。

2.1 主键索引

InnoDB 主键索引 key 值保存主键值,数据域则保存了完整的行记录。如下图:Image

2.2 非主键索引

InnoDB 普通索引 key 值保存索引值,数据域则保存了主键值,查询的时候需要回表查询。如下图:

Image

3.总结

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

精品专栏 70 篇,推荐阅读。
又老性能又差,为什么好多公司依然选择 RabbitMQ?

45 个知识点,带你入门消息队列!

引入了 Disruptor 后,系统性能大幅提升!

 从 MySQL 迁移到 GoldenDB,上来就踩了一个坑。

面试官:MySQL BETWEEN AND 语句包括边界吗?

面试官:MySQL Redo Log 和 Binlog 有什么区别?分别用在什么场景?

面试官:使用 MySQL 时你遇到过哪些索引失效的场景

面试官:MySQL表中有2千万条数据,B+树层高是多少?

面试官:MySQL JOIN 表太多,你有哪些优化思路?

感谢阅读,如果对你有帮助,请点赞和在看。欢迎加我微信:zhujinjun86。

号内回复 seata,下载《阿里分布式中间件Seata从入门到精通》

号内回复 beijing,下载我总结的北京上百家知名科技公司

号内回复 aqs,下载《40张图精通Java AQS》