《面试官:谈谈你对索引的认知》系列之磁盘I/O

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 前面两讲我们介绍了B-/+树的特性对比,数据库系统普遍采用B-/+树作为索引结构。

写在前面


前面两讲我们介绍了B-/+树的特性对比,数据库系统普遍采用B-/+树作为索引结构。

《面试官:谈谈你对索引的认知》系列之B-树


《面试官:谈谈你对索引的认知》系列之B+树


这一节将结合计算机组成原理相关知识讨论B-/+树作为索引的理论基础。一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。


为什么使用索引查询性能会提高


正常查询的时间复杂度是O(N),可能需要全表查询遍历才可以查询到。存储引擎InnoDB,data域存储完整的数据逻辑。聚集型,数据文件本身就是索引文件。


微信图片_20220608215824.png


叶子节点上以年龄分区,叶子节点上保存实际数据,叶子节点互相有指引,类似数组+链表形式,这种查询时间复杂度是O(logN),所以使用索引可以大大降低磁盘I/O。


磁盘存取原理


索引一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。与主存不同,磁盘I/O存在机械运动耗费,因此磁盘I/O的时间消耗是巨大的。


如下所示为磁盘的整体结构示意图:

微信图片_20220608215827.png


一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动(各个磁盘必须同步转动)。在磁盘的一侧有磁头支架,磁头支架固定了一组磁头,每个磁头负责存取一个磁盘的内容。磁头不能转动,但是可以沿磁盘半径方向运动(实际是斜切向运动),每个磁头同一时刻也必须是同轴的,即从正上方向下看,所有磁头任何时候都是重叠的(不过目前已经有多磁头独立技术,可不受此限制)。如下所示为磁盘结构的示意图:


微信图片_20220608215830.png


盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成一个柱面。磁道被沿半径线划分成一个个小的段,每个段叫做一个扇区,每个扇区是磁盘的最小存储单元。为了简单起见,我们下面假设磁盘只有一个盘片和一个磁头。当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。


  • 磁盘I/O时间:数据传输时间+读取磁盘目录时间+寻道时间+旋转时间


存储数据最小单元


在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k。而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。

微信图片_20220608215833.png


在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设置:


mysql>show variables like 'innodb_page_size';


数据表中的数据都是存储在页中的,所以一个页中能存储多少行数据呢?假设一行数据的大小是1k,那么一个页可以存放16行这样的数据。


局部性原理与磁盘预读


由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:


当一个数据被用到时,其附近的数据也通常会马上被使用。


程序运行期间所需要的数据通常比较集中。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页的大小通常为4k)主存和磁盘以页为单位交换数据。


当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。


所以IO一次就是读一页的大小。


总结


MySQL 普遍采用 B+Tree 实现,索引本身很大,不可能全部存储内存,因此需要以索引文件的形式存储磁盘。通常B-/+Tree的高(h)固定情况下,而度(d)会很大,度越大索引性能越好。相对于内存读取,I/O存取的消耗要高几个数量级(内存1s,磁盘100多s),由于MySQL数据存储保存在磁盘中,所以在查询时磁盘I/O是其主要查询性能瓶颈,而使用索引就可以减少磁盘I/O。


微信图片_20220608215836.png

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
面试过程中常遇到的Mysql优化方面的面试题
面试过程中常遇到的Mysql优化方面的面试题
47 0
|
4月前
|
分布式计算 算法 中间件
终于有架构大牛把分布式系统概念讲明白了,竟然用了足足800页
10年来,随着网络技术的发展、计算机应用的深入、分布式系统构建技术的日益成熟,分布式系统逐渐深入到人们的日常活动,并渗透到社会、经济、文化生活的各个方面。现今,分布式系统作为主流的软件系统,已成为人们工作、学习和生活中不可或缺的一部分。
|
10月前
|
设计模式 SQL 数据库
《数据库系统原理》第一遍阅读
又是一年自考,总是听师哥师姐说,自考第一遍不过,第二遍再学习的时候感觉会不一样。很开心我有了一次重学《数据库系统原理》的机会,果然就像师哥师姐所说的,我收获到了知识之外的东西。第二遍学习,我体会到的不仅仅是自己的那份从容和淡定,更感受到了大脑自动编织知识网的神奇。
|
存储 算法 小程序
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
106 0
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
|
存储 自然语言处理 数据管理
谈谈什么是数据?
当前,数据成为了一个广为人知的词,以至于我们中的许多人可能从未想过它的确切定义。
|
存储 缓存 数据库
《面试官:谈谈你对索引的认知》系列之B+树
前面一讲我们介绍了B-树的特性,以及与平衡二叉树的对比得出B-树这类数据结构的优势。
《面试官:谈谈你对索引的认知》系列之B+树
|
存储 关系型数据库 MySQL
《面试官:谈谈你对索引的认知》系列之B-树
对于MySQL索引,相信每位后端同学日常工作中经常会用到,但是对其索引原理,却可能未曾真正深入了解,导致在面试过程中,回答不出重点那就可能要与机会说byebye了。
《面试官:谈谈你对索引的认知》系列之B-树
|
SQL 程序员
看了 100多份 “不合适” 的简历后,忍不住想吐槽这几点
看了 100多份 “不合适” 的简历后,忍不住想吐槽这几点
135 0
看了 100多份 “不合适” 的简历后,忍不住想吐槽这几点
|
SQL 存储 关系型数据库
面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?
本文介绍MySQL索引底层数据结构原理与性能调优。
212 1
面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?
|
前端开发 Java C++
谈谈刻意练习
谈谈刻意练习