在MySQL 8.4 LTS 版本中哪些参数默认值发生变化?

阅读完本篇文章需要十分钟

📢 版本综述

MySQL 8.4 LTS 版本于美国时间 2024 年 4 月 30 日正式发布,是 MySQL 的第一个 LTS (Long Term Support)版本。它主要集中在功能淘汰、参数更新和 bug 修复等方面。

  • 宣布弃用的参数已被正式移除
  • 该版本中多个系统参数的默认值生了变更

🚀 新版生产环境默认参数

✴️ innodb_adaptive_hash_index

Default value
之前ON
新值OFF

一直以来,AHI一直是造成一些性能问题的原因。每个有经验的 DBA 都会建议禁用它。

当数据未发生变化并完全缓存在缓冲池中时,AHI 可能会给select带来一些好处。一旦有写操作,或系统负载较高,或无法缓存读取所需的所有数据,自适应散列索引就会成为一个巨大的瓶颈。

为了获得更可预测的响应时间,建议禁用自适应散列索引。

✴️ innodb_buffer_pool_in_core_file

Default value
之前ON
新值OFF

其实就是在支持MADV_DONTDUMP的系统上默认是关闭的,Linux 3.4开始支持MADV_DONTDUMP,所以该参数在当前很多发行版上默认是OFF。

较大的core files 会带来很多问题。使用这个参数前,建议了解相关联的参数`core_file。

✴️ innodb_buffer_pool_instances

Default value
之前8 (BP 小于 1 G 时为 1)
新值🔎如果innodb_buffer_pool_size 小于 1G,默认值为 1

🔎如果innodb_buffer_pool_size 大于 1G,则为 1-64 之间的最小值:
a. (innodb_buffer_pool_size / innodb_buffer_pool_chunk_size) / 2
b. 可用逻辑处理器的 1/4 (CPU hint)

👻 示例

在将 buffer pool 的大小设置为 2 GB(大于1GB) 之后,查看instances的数据量,我们发现其为2

mysql> select @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
|                              2 |
+--------------------------------+

因为这时(innodb_buffer_pool_size / innodb_buffer_pool_chunk_size)/2为 8;而 MySQL 所在机器的逻辑 CPU 为8,所以innodb_buffer_pool_instances参数值默认为2,即8/4

mysql> select @@innodb_buffer_pool_size/@@innodb_buffer_pool_chunk_size;
+-----------------------------------------------------------+
| @@innodb_buffer_pool_size/@@innodb_buffer_pool_chunk_size |
+-----------------------------------------------------------+
|                                                   16.0000 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

✴️ innodb_doublewrite_files

Default value
之前innodb_buffer_pool_instances * 2
新值2

我们来看MySQL 8.0官方文档中该参数的默认值描述:
![[Pasted image 20240504103419.png]]

但感觉官方文档对这个参数的描述并不准确,按照个人经验,该参数和缓冲池的实例数量并没有关系。

👻 示例

比如在MySQL 8.0.32innodb_buffer_pool_instances 为 8,如果按照官方文档的说法,应该有16个文件, 但是仅有两个double write buffer 文件。

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.32    |
+-----------+
1 row in set (0.00 sec)

mysql> select @@innodb_buffer_pool_instances;
+--------------------------------+
| @@innodb_buffer_pool_instances |
+--------------------------------+
|                              8 |
+--------------------------------+
1 row in set (0.00 sec)

mysql> 

-- files
-rw-r-----  1 mysql mysql    589824 May  2 07:51 '#ib_16384_0.dblwr'
-rw-r-----  1 mysql mysql   8978432 Apr 24 05:49 '#ib_16384_1.dblwr'

✴️ innodb_change_buffering

Default value
之前all
新值none

Change buffering是通过延迟对二级索引的写入操作来支持顺序 I/O 的技术。然而在最新的硬件上,随机 I/O 不再是问题,所以该参数默认值变更为none

有效参数值:

-- none
-- inserts
-- deletes
-- changes
-- purges
-- all

✴️ innodb_doublewrite_pages

Default value
之前innodb_write_io_threads
新值128

以前的innodb_write_io_threads默认值是4,所以没有显示设置该参数的话,innodb_doublewrite_pages 默认值为4。

出于性能考虑,通常给该参数会设置较大的值;所以这次默认值被修改到了128

✴️ innodb_flush_method

Default value
之前fsync
新值如果系统支持则为 O_DIRECT,否则 fsync

需要注意的是,MySQL 如果部署在 Windows 上面的话该参数默认值为unbuffered

一直以来,O_DIRECT 一直是首选值,一般建议设置为它来绕过文件系统缓存。但是还是建议根据实际测试情况选择。

比如在ext4下有些DBA会启用innodb_dedicated_server,使用危险值O_DIRECT_NO_FSYNC(但一般是经验老道的,知道潜在问题的同学)。

注意点:
O_DIRECT设置是使用 O_DIRECT打开数据文件,使用 fsync() 来flush数据和日志文件。

✴️ innodb_io_capacity

Default value
之前200
新值10000

这个参数默认值确实该修改了,因为现在企业基本都用读写性能好的RAIDs或者SSD,很少有传统磁盘了。

✴️ innodb_io_capacity_max

Default value
之前2 * innodb_io_capacity, min of 2000
新值2 * innodb_io_capacity(即默认:20000)

即在以前的版本中,如果2 * innodb_io_capacity没有达到2000,那么innodb_io_capacity_max默认值就是2000。

✴️ innodb_log_buffer_size

Default value
之前16 MB
新值64 MB

较大的 log buffer 可使大事务在运行时无需在事务提交前将日志写入磁盘,即减少磁盘IO。

✴️ innodb_numa_interleave

Default value
之前OFF
新值ON

如果有一个NUMA Node就没什么用。

✴️ innodb_page_cleaners

Default value
之前4
新值innodb_buffer_pool_instances

The number of page cleaner threads that flush dirty pages from buffer pool instances. Page cleaner threads perform flush list and LRU flushing.

✴️ innodb_parallel_read_threads

Default value
之前4
新值logical processors / 8 (最小值为4)

即当logical processors / 8 小于4时,该参数默认值为4。

并行读取聚簇索引的功能,但是不适用于二级索引。

✴️ innodb_purge_threads

Default value
之前4
新值🚩1:logical processors <= 16
🚩4:logical processors > 16

官方认为在一些较小的系统中,4 个 purge 线程可能会造成问题。针对这类系统,将默认值降至 1 是不错的选择。

✴️ innodb_read_io_threads

Default value
之前4
新值logical processors / 2 (最小值为4)

即当logical processors / 2 小于4时,该参数默认值为4。

✴️ innodb_use_fdatasync

Default value
之前OFF
新值ON

在支持 fdatasync() 系统调用的平台上,启用 innodb_use_fdatasync 允许在操作系统刷新时使用 fdatasync() 而不是 fsync() 系统调用。除非后续数据检索需要,否则 fdatasync() 调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。

✴️ temptable_max_ram

Default value
之前1 GB
新值总内存的3%(最小 1 GB,最大 4 GB)

定义 TempTable 引擎在利用磁盘存储数据前可使用的最大内存。默认值为服务器可用内存总量的 3%,最小和最大默认值范围为 1-4 GB。

✴️ temptable_max_mmap

Default value
之前1 GB
新值0
当前版本默认值为 0,即禁止从内存映射临时文件分配内存。

✴️ temptable_use_mmap

Default value
之前ON
新值OFF

定义当 TempTable 引擎占用的内存量超过 temptable_max_ram 限制时,TempTable 引擎是否为内部内存临时表分配内存映射临时文件的空间。默认情况下 TempTable 引擎会使用 InnoDB 磁盘上的内部临时表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值