MySQL 8 InnoDB 32KB 和 64KB 页面大小对 HDD 的好处
MySQL 8 InnoDB 32KB and 64KB page sizes benefits for HDD
MySQL page size documentation 说:
For releases up to and including MySQL 5.5, the size of each InnoDB
page is fixed at 16 kilobytes. This value represents a balance: large
enough to hold the data for most rows, yet small enough to minimize
the performance overhead of transferring unneeded data to memory.
Other values are not tested or supported.
Starting in MySQL 5.6, the page size for an InnoDB instance can be
either 4KB, 8KB, or 16KB, controlled by the innodb_page_size
configuration option. As of MySQL 5.7.6, InnoDB also supports 32KB and
64KB page sizes. For 32KB and 64KB page sizes, ROW_FORMAT=COMPRESSED
is not supported and the maximum record size is 16KB.
然后
Smaller page sizes can help performance with storage devices that use
small block sizes, particularly for SSD devices in disk-bound
workloads, such as for OLTP applications. As individual rows are
updated, less data is copied into memory, written to disk,
reorganized, locked, and so on.
使用比默认 16KB 更高(32KB 或 64KB)的页面大小怎么样?
在什么情况下你应该这样做,你会得到什么好处?
我将使用传统 HDD 设置一个新的 MySQL 实例,我想知道更改默认 16KB 是否会对性能和存储利用率产生影响。
到目前为止我只发现使用 32KB 和 64KB 页面大小的缺点:
For 32KB and 64KB page sizes, ROW_FORMAT=COMPRESSED is not supported
and the maximum record size is 16KB.
有些人达到了大约 8000 字节的最大行大小。切换到 32KB 页面会使该限制加倍。但是,切换到 64KB 不会超过 16KB 的限制。
由于 InnoDB 块倾向于 散布在磁盘周围 ,拥有更大的块将稍微节省 HDD 上的手臂运动。我希望这只是 single-digit 的百分比改进 。它会根据 activity 的类型而有所不同。新加载的 table 可能没有任何改善; table 有很多流失可能会显示一些。
如果您的数据集适合 buffer_pool,则没有多少 I/O 要做,因此块大小不会起作用很多。
通过优化磁盘操作顺序的驱动程序或控制器,手臂运动 的成本在某种程度上被最小化了。带有高速缓存的 RAID 做得特别好,它可以使写入几乎是即时的。 "Hole punching" 可能会增加手臂运动的频率。经典权衡:"speed versus space".
如果您的数据集太大 无法放入 RAM,并且如果您做了很多 "point queries",那么较小 块大小会更好。但是如果你做了很多table(或索引)扫描,那么更大的块大小会有一点好处。
请记住,所有数据必须使用相同的块大小。
在我看到的数以千计的论坛问题中,我认为没有任何一个改变了块大小。您将进入未知水域。
另请注意,虽然 ROW_FORMAT=COMPRESSED
节省了一些磁盘 space,但它占用了一些 RAM——这是因为一些(全部?)块压缩和未压缩都保存在 RAM 中。
我看到的数字 row_format 只有 50%。任何体面的压缩算法几乎可以将任何类型的文本压缩大约 2/3。所以,如果我想使用压缩,我会压缩可压缩的列(例如 TEXT
,但不是 jpg),并在 客户端 中进行压缩,从而卸载 CPU 服务器的努力。我相信(没有任何确凿的证据)这是一种 更好的方式 来压缩您的数据。另外,我几乎从不使用 BIGINT
.
(我在这里所说的一切都是 理论上的 ,基于非常有限的 MySQL 文档或 HDD 的原理。)
我有一个 经验法则 用于优化。 "If the back-of-envelope calculations estimate less than 10% improvement, then move on -- look for something else to optimize."
所以,我说 "move on"。
更大的 DB 块大小降低索引树高度 = 更少 I/O
InnoDB 中的一切都是索引。所以好处应该是显而易见的。硬盘更是如此。
我刚刚通过 dump/load 将数据库块大小更改为 64kB,将 150GB 的数据库从 Percona 5.1 迁移到 5.7。服务器有 128GB 的 RAM,因此读取几乎为零,但我仍然希望备份性能提高,磁盘写入更少,速度更快 shutdown/startup。
关于更大的 DB 块大小的唯一重要考虑是拥有足够的 RAM 并为 InnoDB 提供足够多的 RAM 来缓存。块大小 4 倍大意味着缓存将包含 1/4 的数据库块,这在某些极端情况下可能会由于缓存垃圾而导致更多读取。
MySQL page size documentation 说:
For releases up to and including MySQL 5.5, the size of each InnoDB page is fixed at 16 kilobytes. This value represents a balance: large enough to hold the data for most rows, yet small enough to minimize the performance overhead of transferring unneeded data to memory. Other values are not tested or supported.
Starting in MySQL 5.6, the page size for an InnoDB instance can be either 4KB, 8KB, or 16KB, controlled by the innodb_page_size configuration option. As of MySQL 5.7.6, InnoDB also supports 32KB and 64KB page sizes. For 32KB and 64KB page sizes, ROW_FORMAT=COMPRESSED is not supported and the maximum record size is 16KB.
然后
Smaller page sizes can help performance with storage devices that use small block sizes, particularly for SSD devices in disk-bound workloads, such as for OLTP applications. As individual rows are updated, less data is copied into memory, written to disk, reorganized, locked, and so on.
使用比默认 16KB 更高(32KB 或 64KB)的页面大小怎么样? 在什么情况下你应该这样做,你会得到什么好处?
我将使用传统 HDD 设置一个新的 MySQL 实例,我想知道更改默认 16KB 是否会对性能和存储利用率产生影响。
到目前为止我只发现使用 32KB 和 64KB 页面大小的缺点:
For 32KB and 64KB page sizes, ROW_FORMAT=COMPRESSED is not supported and the maximum record size is 16KB.
有些人达到了大约 8000 字节的最大行大小。切换到 32KB 页面会使该限制加倍。但是,切换到 64KB 不会超过 16KB 的限制。
由于 InnoDB 块倾向于 散布在磁盘周围 ,拥有更大的块将稍微节省 HDD 上的手臂运动。我希望这只是 single-digit 的百分比改进 。它会根据 activity 的类型而有所不同。新加载的 table 可能没有任何改善; table 有很多流失可能会显示一些。
如果您的数据集适合 buffer_pool,则没有多少 I/O 要做,因此块大小不会起作用很多。
通过优化磁盘操作顺序的驱动程序或控制器,手臂运动 的成本在某种程度上被最小化了。带有高速缓存的 RAID 做得特别好,它可以使写入几乎是即时的。 "Hole punching" 可能会增加手臂运动的频率。经典权衡:"speed versus space".
如果您的数据集太大 无法放入 RAM,并且如果您做了很多 "point queries",那么较小 块大小会更好。但是如果你做了很多table(或索引)扫描,那么更大的块大小会有一点好处。
请记住,所有数据必须使用相同的块大小。
在我看到的数以千计的论坛问题中,我认为没有任何一个改变了块大小。您将进入未知水域。
另请注意,虽然 ROW_FORMAT=COMPRESSED
节省了一些磁盘 space,但它占用了一些 RAM——这是因为一些(全部?)块压缩和未压缩都保存在 RAM 中。
我看到的数字 row_format 只有 50%。任何体面的压缩算法几乎可以将任何类型的文本压缩大约 2/3。所以,如果我想使用压缩,我会压缩可压缩的列(例如 TEXT
,但不是 jpg),并在 客户端 中进行压缩,从而卸载 CPU 服务器的努力。我相信(没有任何确凿的证据)这是一种 更好的方式 来压缩您的数据。另外,我几乎从不使用 BIGINT
.
(我在这里所说的一切都是 理论上的 ,基于非常有限的 MySQL 文档或 HDD 的原理。)
我有一个 经验法则 用于优化。 "If the back-of-envelope calculations estimate less than 10% improvement, then move on -- look for something else to optimize."
所以,我说 "move on"。
更大的 DB 块大小降低索引树高度 = 更少 I/O
InnoDB 中的一切都是索引。所以好处应该是显而易见的。硬盘更是如此。
我刚刚通过 dump/load 将数据库块大小更改为 64kB,将 150GB 的数据库从 Percona 5.1 迁移到 5.7。服务器有 128GB 的 RAM,因此读取几乎为零,但我仍然希望备份性能提高,磁盘写入更少,速度更快 shutdown/startup。
关于更大的 DB 块大小的唯一重要考虑是拥有足够的 RAM 并为 InnoDB 提供足够多的 RAM 来缓存。块大小 4 倍大意味着缓存将包含 1/4 的数据库块,这在某些极端情况下可能会由于缓存垃圾而导致更多读取。