MySQL innoDB 页面会在硬盘中碎片化吗?或者 InnoDB 阻止这种情况发生以加快查询速度?
Could MySQL innoDB pages get fragmented inside hard disk? Or InnoDB prevents that from happening to speed up queries?
我的意思是:
https://dev.mysql.com/doc/internals/en/innodb-page-structure.html
这些 16KB MySQL 页面会在内存或磁盘中产生碎片吗?这意味着如果我们获取磁盘映像或内存映像,这些 16KB 的页面是否有可能被碎片化?这意味着如果我拍摄 MySQL 文件夹的图像,16KB 的页面是否会连续成块,或者其中一些可能会变得支离破碎?
或 MySQL 以不会分散的方式实施它们?如果可以,怎么做?
与 MySQL 或 InnoDB 相比,这更像是一个文件系统或操作系统问题。 InnoDB 正在写入文件,文件系统确实有可能将写入碎片化到单个 16 KiB InnoDB 页面,因此它在物理磁盘上不连续。然而,对于现代服务器和 SSD 存储,这基本上 100% 的时间都发生在底层媒体上。
至少我一般不会担心。
(我已经在你的类似问题中讨论了 disk a length。我将在这里解决 RAM。)
也许二十年前,超过一半的 CPU 已经移动到 "virtual" 地址,这与 "physical" 地址不同。为实现这一点,硬件人员实施了一种 "translation" 机制,该机制将程序使用的 32 位(或 64 位)虚拟地址映射到访问 RAM 的物理地址。这是在硬件中相对较低的级别完成的。当物理地址交换到磁盘或尚未为用户程序分配时,硬件会处理异常。
为了翻译的精度,制造商大多选择 4KB 页面大小。也就是说,底部 12 位 (2^12=4K) 原封不动地通过翻译;最高位被映射(通过片上查找 table,由 RAM 中的数组支持),从虚拟映射到物理。这是为每次内存访问完成的(除了可能在引导期间)。
使用该机制,用户程序可以完全忘记 4KB 页面在 RAM 中的位置,以及它们是否分散。
底线:忘掉内存映像吧。碎片化真的不是问题。
另一方面,交换可能是个问题。我认为 MySQL 和 InnoDB 的设计假设是 RAM 中的所有内容都保留在 RAM 中。请注意他们如何努力缓存数据块、索引块、table 定义等。因此,not 调整 MySQL 以便系统需要交换。
我的意思是:
https://dev.mysql.com/doc/internals/en/innodb-page-structure.html
这些 16KB MySQL 页面会在内存或磁盘中产生碎片吗?这意味着如果我们获取磁盘映像或内存映像,这些 16KB 的页面是否有可能被碎片化?这意味着如果我拍摄 MySQL 文件夹的图像,16KB 的页面是否会连续成块,或者其中一些可能会变得支离破碎?
或 MySQL 以不会分散的方式实施它们?如果可以,怎么做?
与 MySQL 或 InnoDB 相比,这更像是一个文件系统或操作系统问题。 InnoDB 正在写入文件,文件系统确实有可能将写入碎片化到单个 16 KiB InnoDB 页面,因此它在物理磁盘上不连续。然而,对于现代服务器和 SSD 存储,这基本上 100% 的时间都发生在底层媒体上。
至少我一般不会担心。
(我已经在你的类似问题中讨论了 disk a length。我将在这里解决 RAM。)
也许二十年前,超过一半的 CPU 已经移动到 "virtual" 地址,这与 "physical" 地址不同。为实现这一点,硬件人员实施了一种 "translation" 机制,该机制将程序使用的 32 位(或 64 位)虚拟地址映射到访问 RAM 的物理地址。这是在硬件中相对较低的级别完成的。当物理地址交换到磁盘或尚未为用户程序分配时,硬件会处理异常。
为了翻译的精度,制造商大多选择 4KB 页面大小。也就是说,底部 12 位 (2^12=4K) 原封不动地通过翻译;最高位被映射(通过片上查找 table,由 RAM 中的数组支持),从虚拟映射到物理。这是为每次内存访问完成的(除了可能在引导期间)。
使用该机制,用户程序可以完全忘记 4KB 页面在 RAM 中的位置,以及它们是否分散。
底线:忘掉内存映像吧。碎片化真的不是问题。
另一方面,交换可能是个问题。我认为 MySQL 和 InnoDB 的设计假设是 RAM 中的所有内容都保留在 RAM 中。请注意他们如何努力缓存数据块、索引块、table 定义等。因此,not 调整 MySQL 以便系统需要交换。