Mysql 二级索引回表知识点:顺序I/O & 随机I/O

浪尽此生 提交于 2020-02-02 15:27:42

一、准备工作

1.1 创建一张数据表

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL COMMENT 'ID',
  `name` varchar(64) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `birth` timestamp NULL DEFAULT NULL COMMENT '出生日期',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在创建 student 表的同时创建了二级索引 idx_name (name)

1.2 准备测试数据

创建三条二级索引回表测试数据

二、顺序I/O & 随机I/O

执行 SQL 语句如下:

select * 
from student
where name > '马百万' and name < '马百万3'

毫无疑问,展示出的记录是为 name = 马百万2 的记录。但是在查询的这个过程中存储数据底层发生了 顺序I/O & 随机I/O 两步操作

三、总结

name 字段我们建立了二级索引 idx_name,所以 name 字段底层也是根据 B+Tree 的结构进行了相关排序,由于 B+Tree 的特性之一:数据页内的记录是按照索引列的大小顺序排成一个单向链表,那么 马百万 - 马百万3 这几条记录在磁盘中相邻的,存储在一个数据页或是多个相邻数据页中。这样,我们可以快速的将数据从磁盘读取到内存中,这种读取方式被称为顺序IO

二级索引的 B+Tree 叶子节点中存储的并不是记录行,而是主键相关信息,根据主键再去聚簇索引结果集中找寻到结果相关记录,这就是一个回表的过程,而 随机I/O 就是在回表过程中产生的。比如我们刚才查到记录ID主键如果不相连的话,那么在存储层面就可能是不存在同一个数据页当中。这个时候我们想要获取学生信息,就需要根据主键访问更多的数据页,这也就是随机I/O

从性能上来说:顺序IO随机I/O 更快

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!