每次提到“碎片”,我们自然而然的想到了我们电脑中的那个磁盘碎片。在数据库中,我们提到碎片,很多的时候我们开始犯糊涂了,因为我们曾经也在某些地方听说过“索引碎片”这个东西。后,我们开始认为:可能索引“碎片”中的那个“碎片和”和“磁盘碎片”中的那个“碎片”是差不多的,甚至是相同的。

  有朋友可能会从数据库的存储机制去分析,但是后可能分析清晰了索引碎片是怎么样回事,至于它和磁盘碎片是不是一样,不得而知了。

  其实上面说的那些问题,也是我们团队在为客户解决问题的时候遇到的曾经遇到的问题,而且也做了不少傻事情,后才慢慢的明白到底是怎么回事。

  当然,既然写了这篇文章,那么说明:它们不是一样的,不是所有的“碎片”都是一样的,好比不是所有长长头发的人都是女人一样。

  那我们来看看它们之前的区别吧。

  其实物理磁盘碎片是Windows在物理磁盘上面工作而产生的一个副作用。我们也知道,清理磁盘碎片可以使得我们的计算机运行的更快,而且Windows也是内置了一些磁盘碎片清理的工具。

  磁盘碎片之所以使得我们计算机的性能下降,主要是因为它增加了磁头读取数据的延迟时间。我这里借用CareySon的一个图片来说明一下:

我们知道,Windows会把文件保存到磁盘的空闲空间中,如果寻找到的空间不足以存放所有 的文件数据,那么文件分段会被保存到磁盘的多个地方,我们暂且称这些分段为数据块,或者理解为磁盘中的那个“扇区”,每个扇区都是有大小的。那么,当在读取数据的时候,磁盘的磁头会定位到磁盘中的各个不同的扇区。

  一般而言,磁头移动数据块的时间是读取数据块中数据时间的3-4倍。或者说,寻道时间一般是数据读取时间的3-4倍。

  如果此时,在计算机的的磁盘中存在碎片(至于碎片如何产生,我这里也不花时间讲述,重点不在这里,而且也不难),那么数据的读取操作发生了变化。原本数据读取时的操作是“寻道-读取数据-读取数据…”,因为没有碎片,数据所在的扇区是连续的。如果有了碎片,那么读取的操作变为了“寻道-读取-寻道-读取-寻道-读取”,很显然,数据的读取延迟了。我们还是给大家看一个更加形象的图示:

从上图中可以知道,磁盘碎片使得原本只要读取两个扇区的时间从6ms变到了18ms。试想:如果一个文件有成百上千个扇区,那么读取的延时是非常的严重的,尽管我们感觉不到,因为读取的时间依然很短,但是如何在多用户,大并发的情况下,延时的后果可想而知,当然,此时我们可以采用更多的措施和策略。