innodb_read_io_threads不可动态修改,必须在[mysqld]段配置文件中设置并重启MySQL服务;默认值为4,NVMe SSD+16核以上可设8~12,需同步调整innodb_io_capacity、innodb_io_capacity_max、innodb_write_io_threads和thread_cache_size等参数。

innodb_read_io_threads 不能动态修改,必须重启生效
直接执行 SET GLOBAL innodb_read_io_threads = 8 会报错:Variable 'innodb_read_io_threads' is a read only variable。这不是权限问题,而是该参数属于「只读静态变量」,MySQL 启动后就锁死,运行时 SET 完全无效。
唯一可靠方式是改配置文件 + 重启:
- 打开
/etc/my.cnf(Linux)或C:\my.ini(Windows) - 在
[mysqld]段下添加或修改:innodb_read_io_threads = 8 - 保存后执行
systemctl restart mysqld(或service mysql restart) - 验证:连上 MySQL 执行
SELECT @@innodb_read_io_threads;,返回值应与配置一致
设多少才不浪费也不拖慢——看硬件和负载类型
默认值 4 是为通用场景保守设计的,高配机器上基本不够用;但盲目设高(比如直接写 64)反而引发上下文切换开销,CPU 跑满、I/O 却没涨。
实操建议按以下组合判断:
-
NVMe SSD + 16 核以上:设
8~12,别超16 -
SATA SSD:设
6~8 -
HDD:保持
4或最多4,再多线程也喂不饱磁盘 -
读密集型 OLAP(大表扫描、JOIN 多):可比
innodb_write_io_threads高2~4 - 短事务点查为主(如 API 后端):调这个参数收益极低,瓶颈通常在连接池或网络
单独调线程数没用,必须配齐这四个参数
只改 innodb_read_io_threads,其他参数卡在默认值,等于给涡轮增压发动机配化油器——I/O 调度器根本不放行更多请求。
必须同步检查并调整:
-
innodb_io_capacity:设为磁盘实测随机读 IOPS 的50%~75%(例如 NVMe 实测 50k,这里填25000~37500) -
innodb_io_capacity_max:建议设为innodb_io_capacity的2倍,应对突发压力 -
innodb_write_io_threads:最好与读线程对称设置(如都设8),避免 Redo Log 或 Buffer Pool 刷脏失衡 -
thread_cache_size:若应用频繁建连断连(如 PHP-FPM 默认模式),设成8~16,否则后台 IO 线程再快,前端也在排队
为什么 iostat 没变化?先确认 native AIO 是否真启用
改完线程数、重启、验证参数生效,但 iostat -x 1 中 %util 和 await 没改善,甚至更差——大概率是 innodb_use_native_aio 没真正跑起来。
必须验证这两点:
- 执行
SELECT @@innodb_use_native_aio;,结果必须是1,否则实际走的是模拟 AIO(sync mode),线程再多也串行处理 - Linux 下检查内核支持:
grep -i aio /proc/sys/fs/aio-max-nr,返回值应远大于你设的线程总数(比如设了12读 +12写,aio-max-nr 至少要 > 50000)
OS 层没跟上,MySQL 配置再激进也是白搭。磁盘没饱和、缓冲池太小、文件系统挂载选项限制(比如 XFS 没开 noatime),这些都比调线程数优先级更高。


















