一、准备工作
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 更快