知识点整理-mysql的顺序I/O和随机I/O

假设有这样一张表:

CREATE TABLE `person_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `birthday` date NOT NULL,
  `phone_number` char(11) NOT NULL,
  `country` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name_birthday_phone_number` (`name`,`birthday`,`phone_number`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

其中,有个二级索引`idx_name_birthday_phone_number` (`name`,`birthday`,`phone_number`)

假设有这样3条数据:

我们在进行范围查找的时候,如

SELECT *
FROM person_info
WHERE name > 'Ashburn' AND name < 'Ashburn3'

由于索引idx_name_birthday_phone_number对应的B+树中的 记录首先会按照name列的值进行排序,所以值在Ashburn~Ashbur3之间 的记录在磁盘中的存储是相连的,集中分布在一个或几个数据⻚中, 我们可以很快的把这些连着的记录从磁盘中读出来,这种读取方式我 们也可以称为顺序I/O。根据第1步中获取到的记录的id字段的值可 能并不相连,而在聚簇索引中记录是根据id(也就是主键)的顺序 排列的,所以根据这些并不连续的id值到聚簇索引中访问完整的用 户记录可能分布在不同的数据⻚中,这样读取完整的用户记录可能要 访问更多的数据⻚,这种读取方式我们也可以称为随机I/O。一般情 况下,顺序I/O比随机I/O的性能高很多,所以步骤1的执行可能很 快,而步骤2就慢一些。

 

posted @ 2019-07-02 17:08  加肥猫咪  阅读(...)  评论(... 编辑 收藏