目录标题
Summary
Below is a comparison of your current settings against MySQL 8.0 defaults, with guidance on whether those defaults are reasonable and how to calculate optimal values based on your environment:
innodb_buffer_pool_instances
: Default is 8 (wheninnodb_buffer_pool_size ≥ 1 GB
), but you’ve set 3. Aim for each instance to manage at least 1 GB of buffer pool to avoid contention.innodb_page_cleaners
: Default is 4 (since MySQL 5.7.8) and auto-adjusts to matchinnodb_buffer_pool_instances
if it exceeds it; you’ve set 2. In general, use at least as many cleaners as pool instances.innodb_write_io_threads
: Default is 4; you’ve increased to 16. Tune this toward the number of physical I/O channels (disks/SSDs) or CPU cores handling I/O for your workload.log_bin_trust_function_creators
: Default is OFF (0); switching to ON (1) relaxes strict binary-logging checks on stored routines, but should only be done if you trust creators to declare functions deterministic or read-only.slave_parallel_workers
: Default is 0 (parallel replication disabled); you’ve set 16. A good starting point is min(CPU_cores−1, number_of_concurrent_replicated_ddl_transactions).
1. innodb_buffer_pool_instances
1.1 默认值
- 当
innodb_buffer_pool_size ≥ 1 GB
时,默认实例数为 8。 - 更早版本(或在特殊平台)会按
innodb_buffer_pool_size / 128 MB
四舍五入决定实例数;若池大小 < 1.3 GB,则实例数为 1。
1.2 是否合理 & 调优计算
-
原则:每个实例至少管理 1 GB 缓冲池,以减少内部争用和锁开销。
-
计算方法:
innodb_buffer_pool_instances ≈ FLOOR(innodb_buffer_pool_size / 1 GB)
-
对于 32 GB 缓冲池,建议实例数 ≈ 32;对于 8 GB 池,实例数 ≈ 8。
2. innodb_page_cleaners
2.1 默认值
- 自 MySQL 5.7.8 起,默认值由 1 提升至 4;若该值超过
innodb_buffer_pool_instances
,则自动下调至与实例数相同。 - 官方文档说明,页清理器线程数默认与缓冲池实例数相同(即通常 8),但早期文档中仍列出默认 4。
2.2 是否合理 & 调优计算
-
原则:页清理器数量应 ≥ 缓冲池实例数,以确保每个实例都有专属后台线程来刷新脏页。
-
计算方法:
innodb_page_cleaners = innodb_buffer_pool_instances
-
如果你只有 3 个池实例,将清理器设为 3 或更高,避免某些实例缺乏刷盘线程。
3. innodb_write_io_threads
3.1 默认值
- MySQL 8.0 默认为 4,覆盖读写双向 IO 线程各 4 条。
3.2 是否合理 & 调优计算
-
原则:依据底层存储设备并行 I/O 能力(磁盘通道或 NVMe 队列深度)及 CPU 核心数,适当提升线程数。
-
计算方法:
innodb_write_io_threads ≈ MIN(innodb_read_io_threads, physical_IO_channels)
-
在多 SSD 或高端存储阵列上,可将其提升至 8–16,以匹配并行度。
4. log_bin_trust_function_creators
4.1 默认值
- 默认值为 OFF(0),即创建存储函数时必须具有 SUPER 权限,且函数需声明为 DETERMINISTIC 或不修改数据。
4.2 是否可以设置为 ON
- 可行性:若你信任开发者创建的函数均满足安全及幂等性,可将其设为 ON(1),以省去额外权限或声明检查。设为 ON 后,写入二进制日志时便不再强制要求函数必须是 DETERMINISTIC 或不修改数据。
- 风险:若函数非幂等且修改数据,崩溃恢复或复制时可能产生不一致。
5. slave_parallel_workers
5.1 默认值
- 在 MySQL 8.0 中,默认值为 0,表示并行复制功能关闭;你查到的“默认 4”可能是某些云服务(如阿里云 RDS)的自定义模板值。
- 本地 MySQL 8.0.25+ 已弃用此变量并改由 Group Replication 机制管理;在 8.3.0 以后完全移除。
5.2 是否合理 & 调优计算
-
原则:并行复制线程数不要超过从库 CPU 核心数减 1,同时结合复制事务的类型及数量。
-
计算方法:
slave_parallel_workers ≈ LEAST(CPU_cores − 1, avg_concurrent_transactions)
-
如果你有 16 个核心且平均有 8 个并发事务,则可将其设为 8–12,视复制滞后情况再做微调。
参考链接
- MySQL 8.4 Reference Manual: Configuring Multiple Buffer Pool Instances (MySQL开发者专区)
- DBA.StackExchange: innodb_buffer_pool_instances default logic (Database Administrators Stack Exchange)
- DBA.StackExchange: innodb_page_cleaners default and auto-adjustment (Database Administrators Stack Exchange)
- MySQL 8.2 Manual: Configuring Buffer Pool Flushing (MySQL开发者专区)
- MinervaDB: Tuning InnoDB I/O Threads in MySQL 8 (minervadb.xyz)
- MySQL 8.4 Manual: Stored Program Binary Logging (MySQL开发者专区)
- AWS Blog: slave_parallel_workers default and usage (Amazon Web Services, Inc.)
- MySQL Shell 8.2 Manual: Deprecation of slave_parallel_workers (MySQL开发者专区)