16.1 磁盘结构

16.1.1 盘片

16.1.2 磁道、扇区

16.1.3 柱面

16.2 磁盘相关计算
16.2.1 磁盘容量
:::info
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数(一般是 512个字节~4k个字节)
:::
16.2.2 磁盘的物理地址
磁盘上数据必须用一个三维地址唯一标示:柱面号 + 盘面号 + 扇区号。三者可以标识任意一个磁盘块。读/写磁盘上某一指定数据需要下面步骤:
① 根据“柱面号”前后移动磁臂,让磁头指向指定柱面;
② 旋转磁盘,让磁头抵达待读的起始扇区。
③ 激活指定盘面对应的磁头;
④ 旋转磁盘,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。
可以看见,磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘 I/O 的时间,一般大概 9ms 左右。
16.2.3 磁盘读取响应时间
- 寻道时间:磁头从接收到指令开始,移动到数据所在磁道(柱面)所需要的时间,寻道时间越短,I/O 操作越快。目前磁盘的平均寻道时间一般在 3-15ms,一般都在 9ms 左右。
- 旋转延迟:盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间,旋转延迟取决于磁盘转速。
- 数据传输时间:完成传输所请求的数据所需要的时间,纳秒级。
所以读写一次磁盘信息所需的时间可分解为:寻道时间、延迟时间、传输时间。一次磁盘 I/O 绝大部分时间消耗在寻道上了。
16.3 磁盘 I/O
16.3.1 顺序 I/O
顺序 I/O 是指读写操作的访问地址连续。在顺序 I/O 访问中,HDD 所需的磁道搜索时间显着减少,因为读/写磁头可以以最小的移动访问下一个块。

16.3.2 随机 I/O
随机 I/O 是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。此时需要消耗大量时间,频繁的寻道。

16.3.3 局部性原理
为了提高效率,要尽量减少磁盘 I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存,这个称之为 预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),一般来说,磁盘的顺序读的效率是随机读的 40 到 400 倍都有可能,顺序写是随机写的 10 到 100 倍(SSD 盘则差距要小的多,顺序读写的效率是随机读写的 7 到 10 倍,但是有评测表明机械硬盘的顺序写性能稍优于 SSD。总的来说 MySQL 数据库如果由硬盘由机械的换成 SSD 的,性能会有很大的提升)。
因此对于具有局部性的程序来说,预读可以提高 I/O 效率。预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页,页大小通常为 4k 当然也有 16K 的,主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
16.4 磁盘与 B+Tree
InnoDB 里,默认定义的 B+Tree 的节点大小是 16KB,这就是说,假如一个 Key 是 8 个字节,那么一个节点可以存放大约 1000 个 Key,意味着 B+Tree 可以有 1000 个分叉。同时 InnoDB 每一次磁盘 I/O,读取的都是 16KB 的整数倍的数据。也就是说 InnoDB 在节点的读写上是可以充分利用磁盘顺序 I/O 的高速读写特性。
同时按照 B+Tree 逻辑结构来说,在叶子节点一层,所有记录的主键按照从小到大的顺序排列,并且形成了一个双向链表。同一层的非叶子节点也互相串联,形成了一个双向链表。那么在实际读写的时候,很大的概率相邻的节点会放在相邻的页上,又可以充分利用磁盘顺序 I/O 的高速读写特性。所以我们对 MySQL 优化的一大方向就是尽可能的多让数据顺序读写,少让数据随机读写。
16.1 磁盘结构

16.1.1 盘片

16.1.2 磁道、扇区

16.1.3 柱面

16.2 磁盘相关计算
16.2.1 磁盘容量
:::info
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数(一般是 512个字节~4k个字节)
:::
16.2.2 磁盘的物理地址
磁盘上数据必须用一个三维地址唯一标示:柱面号 + 盘面号 + 扇区号。三者可以标识任意一个磁盘块。读/写磁盘上某一指定数据需要下面步骤:
① 根据“柱面号”前后移动磁臂,让磁头指向指定柱面;
② 旋转磁盘,让磁头抵达待读的起始扇区。
③ 激活指定盘面对应的磁头;
④ 旋转磁盘,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。
可以看见,磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘 I/O 的时间,一般大概 9ms 左右。
16.2.3 磁盘读取响应时间
- 寻道时间:磁头从接收到指令开始,移动到数据所在磁道(柱面)所需要的时间,寻道时间越短,I/O 操作越快。目前磁盘的平均寻道时间一般在 3-15ms,一般都在 9ms 左右。
- 旋转延迟:盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间,旋转延迟取决于磁盘转速。
- 数据传输时间:完成传输所请求的数据所需要的时间,纳秒级。
所以读写一次磁盘信息所需的时间可分解为:寻道时间、延迟时间、传输时间。一次磁盘 I/O 绝大部分时间消耗在寻道上了。
16.3 磁盘 I/O
16.3.1 顺序 I/O
顺序 I/O 是指读写操作的访问地址连续。在顺序 I/O 访问中,HDD 所需的磁道搜索时间显着减少,因为读/写磁头可以以最小的移动访问下一个块。

16.3.2 随机 I/O
随机 I/O 是指读写操作时间连续,但访问地址不连续,随机分布在磁盘的地址空间中。此时需要消耗大量时间,频繁的寻道。

16.3.3 局部性原理
为了提高效率,要尽量减少磁盘 I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存,这个称之为 预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),一般来说,磁盘的顺序读的效率是随机读的 40 到 400 倍都有可能,顺序写是随机写的 10 到 100 倍(SSD 盘则差距要小的多,顺序读写的效率是随机读写的 7 到 10 倍,但是有评测表明机械硬盘的顺序写性能稍优于 SSD。总的来说 MySQL 数据库如果由硬盘由机械的换成 SSD 的,性能会有很大的提升)。
因此对于具有局部性的程序来说,预读可以提高 I/O 效率。预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页,页大小通常为 4k 当然也有 16K 的,主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
16.4 磁盘与 B+Tree
InnoDB 里,默认定义的 B+Tree 的节点大小是 16KB,这就是说,假如一个 Key 是 8 个字节,那么一个节点可以存放大约 1000 个 Key,意味着 B+Tree 可以有 1000 个分叉。同时 InnoDB 每一次磁盘 I/O,读取的都是 16KB 的整数倍的数据。也就是说 InnoDB 在节点的读写上是可以充分利用磁盘顺序 I/O 的高速读写特性。
同时按照 B+Tree 逻辑结构来说,在叶子节点一层,所有记录的主键按照从小到大的顺序排列,并且形成了一个双向链表。同一层的非叶子节点也互相串联,形成了一个双向链表。那么在实际读写的时候,很大的概率相邻的节点会放在相邻的页上,又可以充分利用磁盘顺序 I/O 的高速读写特性。所以我们对 MySQL 优化的一大方向就是尽可能的多让数据顺序读写,少让数据随机读写。
1134

被折叠的 条评论
为什么被折叠?



