面试官: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 条数据:
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+ 树,但索引结构完全不同,一个是聚集索引,一个是非聚集索引。
从 MySQL 迁移到 GoldenDB,上来就踩了一个坑。
面试官:MySQL BETWEEN AND 语句包括边界吗?
面试官:MySQL Redo Log 和 Binlog 有什么区别?分别用在什么场景?
感谢阅读,如果对你有帮助,请点赞和在看。欢迎加我微信:zhujinjun86。
号内回复 seata,下载《阿里分布式中间件Seata从入门到精通》
号内回复 beijing,下载我总结的北京上百家知名科技公司
号内回复 aqs,下载《40张图精通Java AQS》