Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL innoDB页面是否会在硬盘中碎片化?或者InnoDB阻止这种情况发生以加速查询?_Mysql_Innodb - Fatal编程技术网

MySQL innoDB页面是否会在硬盘中碎片化?或者InnoDB阻止这种情况发生以加速查询?

MySQL innoDB页面是否会在硬盘中碎片化?或者InnoDB阻止这种情况发生以加速查询?,mysql,innodb,Mysql,Innodb,我所说的页数是指: 这些16KB的MySQL页面会在内存或磁盘中碎片化吗?也就是说,如果我们使用磁盘映像或内存映像,这些16KB的页面是否有可能被碎片化?也就是说,如果我拍摄MySQL文件夹的图像,16KB的页面会是连续的块,还是有些会变得支离破碎 或者MySQL以一种不会碎片化的方式实现它们?如果是这样,怎么做?这更像是一个文件系统或操作系统问题,而不是MySQL或InnoDB。InnoDB正在写入一个文件,并且确实可能是文件系统将写入的内容分段到单个16 KiB InnoDB页面,从而使其

我所说的页数是指:

这些16KB的MySQL页面会在内存或磁盘中碎片化吗?也就是说,如果我们使用磁盘映像或内存映像,这些16KB的页面是否有可能被碎片化?也就是说,如果我拍摄MySQL文件夹的图像,16KB的页面会是连续的块,还是有些会变得支离破碎


或者MySQL以一种不会碎片化的方式实现它们?如果是这样,怎么做?

这更像是一个文件系统或操作系统问题,而不是MySQL或InnoDB。InnoDB正在写入一个文件,并且确实可能是文件系统将写入的内容分段到单个16 KiB InnoDB页面,从而使其在物理磁盘上不连续。但是,对于现代服务器和SSD存储,基本上100%的时间都是在底层介质上进行的


至少对我来说,这通常不是一个问题。

这更像是一个文件系统或操作系统问题,而不是MySQL或InnoDB。InnoDB正在写入一个文件,并且确实可能是文件系统将写入的内容分段到单个16 KiB InnoDB页面,从而使其在物理磁盘上不连续。但是,对于现代服务器和SSD存储,基本上100%的时间都是在底层介质上进行的

至少对我来说,这通常不是一个问题。

(我已经在类似的问题中讨论了磁盘的长度。我将在这里讨论RAM。)

大约二十年前,超过一半的CPU已经转移到“虚拟”地址,这与“物理”地址不同。为了实现这一点,硬件人员实现了一种“转换”机制,将程序使用的32位(或64位)虚拟地址映射为访问RAM的物理地址。这是在相对较低的硬件级别上完成的。随着硬件的出现,当物理地址交换到磁盘或尚未分配给用户程序时,会出现异常处理

为了保证翻译的精确性,制造商大多选择4KB的页面大小。也就是说,底部12位(2^12=4K)在未触及的情况下通过转换馈送;顶层位从虚拟映射到物理(通过片上查找表,由RAM中的阵列支持)。每次内存访问都会执行此操作(可能在引导期间除外)

通过这种机制,用户程序可以完全忘记4KB页面在RAM中的位置,以及它们是否分散

底线:忘记内存映像。碎片化确实不是问题

另一方面,交换可能是一个问题。我认为MySQL和InnoDB的设计假设RAM中的所有内容都保留在RAM中。请注意他们是如何努力缓存数据块、索引块、表定义等的。因此,不要调整MySQL以使系统需要交换。

(我已经在类似问题中讨论了磁盘长度。我将在这里讨论RAM。)

大约二十年前,超过一半的CPU已经转移到“虚拟”地址,这与“物理”地址不同。为了实现这一点,硬件人员实现了一种“转换”机制,将程序使用的32位(或64位)虚拟地址映射为访问RAM的物理地址。这是在相对较低的硬件级别上完成的。随着硬件的出现,当物理地址交换到磁盘或尚未分配给用户程序时,会出现异常处理

为了保证翻译的精确性,制造商大多选择4KB的页面大小。也就是说,底部12位(2^12=4K)在未触及的情况下通过转换馈送;顶层位从虚拟映射到物理(通过片上查找表,由RAM中的阵列支持)。每次内存访问都会执行此操作(可能在引导期间除外)

通过这种机制,用户程序可以完全忘记4KB页面在RAM中的位置,以及它们是否分散

底线:忘记内存映像。碎片化确实不是问题


另一方面,交换可能是一个问题。我认为MySQL和InnoDB的设计假设RAM中的所有内容都保留在RAM中。请注意他们是如何努力缓存数据块、索引块、表定义等的。因此,不要调优MySQL以使系统需要交换。

谢谢您的回答!所以MySQL不能确保这些16KB的页面获得连续的块来加速查询?如果它们变得支离破碎,这不会对性能造成很大影响吗?还有,为什么现代服务器不会出现碎片化?他们总是提供连续的数据块吗?在现代操作系统上,没有实际的方法要求您的数据不被碎片化,分配(和潜在的碎片化)发生在如此低的级别,以至于MySQL之类的应用程序无法看到或控制。很抱歉再次打扰,那你对这篇论文有什么想法吗。他们使用页面雕刻从MySQL之类的数据库中恢复数据,但如果这些页面变得支离破碎,那么这种方法将如何工作?(他们使用与所有页面相同的ID在磁盘映像中查找页面,然后恢复其内容)@OneAndOnly-SSD上的碎片不是性能问题。在硬盘上,寻道时间是碎片消耗时间的地方。感谢您的回答!所以MySQL不能确保这些16KB的页面获得连续的块来加速查询?如果它们变得支离破碎,这不会对性能造成很大影响吗?还有,为什么现代服务器不会出现碎片化?他们总是提供连续的数据块吗?在现代操作系统上,没有实际的方法要求您的数据不被碎片化,分配(和潜在的碎片化)发生在如此低的级别,以至于应用程序(如MySQL)无法看到或控制。很抱歉再次打扰,但是您有什么想法吗