MYSQL INNODB 相关参数

来源:这里教程网 时间:2026-03-01 18:35:14 作者:

1.innodb_buffer_pool_size (物理内存80%)

innodb_buffer_pool_size
├── 数据页缓存 (约 70-80%)
│   ├── 表数据页
│   ├── 主键索引页
│   └── 二级索引页
├── 更改缓冲区 (最多25%)
├── 自适应哈希索引 (自动管理)
├── 锁信息
└── 内部数据结构
# 核心参数
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 8
# LRU 管理
innodb_old_blocks_pct = 37  # Old Sublist 占比
innodb_old_blocks_time = 1000  # 页在Old列表停留时间(ms)
# 刷新策略
innodb_max_dirty_pages_pct = 90  # 最大脏页百分比
innodb_max_dirty_pages_pct_lwm = 10  # 低水位线
# 预读
innodb_read_ahead_threshold = 56  # 线性预读阈值
innodb_random_read_ahead = OFF  # 随机预读
#预热
启用 innodb_buffer_pool_dump_at_shutdown 和 innodb_buffer_pool_load_at_startup innodb_buffer_pool_dump_pct

2.innodb_log_buffer_size 日志缓存innodb_flush_log_at_trx_commit 日志缓存写到文件的方式0每秒刷盘。1提交刷盘。2折中方案 MySQL 崩溃:无丢失 OS 崩溃:最多丢失 1 秒数据3. innodb_redo_log_capacity 日志文件动态调整innodb_log_file_size 固定日志文件大小 4.innodb_flush_method 控制 InnoDB 如何刷新数据到磁盘

选项 描述 适用场景
fsync 默认值,调用 fsync() 兼容性好
O_DSYNC 使用 O_SYNC 打开日志文件 日志安全优先
O_DIRECT 绕过 OS 缓存直接 I/O 高性能,避免双缓存
O_DIRECT_NO_FSYNC O_DIRECT + 减少 fsync 调用 Linux 5.6+,特定硬件
littlesync 实验性,异步 I/O 测试环境
nosync 实验性,不刷新 仅测试,危险

5.show engine innodb status\G

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 0   #总分配内存
Dictionary memory allocated 702565  #数据字典内存
Buffer pool size   33044  #有多少个页
Free buffers       21942  #有多少空白页
Database pages     11102  #LRUlist有多少页在使用
Old database pages 4078  #old页
Modified db pages  0  #脏页
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 709, not young 820
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1580, created 9524, written 11088
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 11102, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

6.change buffer

innodb_change_buffering
Change Buffer 最大大小 = 
    innodb_buffer_pool_size × innodb_change_buffer_max_size / 100
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
Hash table size 138401, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

7.临时表空间

tmpdir 存储:
├── 临时表文件(MyISAM/MEMORY引擎)
│   ├── #sql_xxx.MYD
│   ├── #sql_xxx.MYI
│   └── #sql_xxx.frm(5.7及之前)
├── 排序文件(sort buffer 溢出)
│   ├── MYxxxxxxxx
├── 分组临时文件
├── UNION 临时文件
├── 某些 JOIN 的临时文件
└── 其他引擎的临时文件
innodb_tmpdir 存储:
├── 在线 DDL 临时文件
│   ├── 重建表的中间文件
│   ├── 索引创建临时文件
│   └── 列修改临时文件
├── 临时表空间文件(如果使用 TempTable)
│   ├##ibtmp1(如果指定位置)
└── 仅限 InnoDB 的内部临时文件
# innodb_temp_tablespaces_dir 目录
/var/lib/mysql-temp/innodb_temp/
├── ibtmp1          # 固定文件名,存储临时表数据
└── temp_*.ibt      # 临时表空间文件
# innodb_tmpdir 目录
/fast-ssd/innodb_tmp/
├── #sql_xxx_0.ibd  # 临时创建的文件
├── #sql_xxx_1.ibd
├── tmp_sort_xxx    # 排序操作临时文件
└── tmp_ddl_xxx     # DDL操作临时文件
1. 查询开始执行
   ↓
2. 创建临时表(内存中)
   ├── 如果使用 TempTable 引擎 → temptable 内存池
   ├── 如果使用 MEMORY 引擎 → MEMORY 引擎内存池
   └── 如果使用 InnoDB 引擎 → InnoDB 缓冲池
   ↓
3. 数据填充
   ↓
4. 达到内存限制
   ↓
5. 溢出到磁盘
   ├── TempTable + mmap=ON → tmpdir 的 mmap 文件
   ├── TempTable + mmap=OFF → #innodb_temp 表空间
   └── MEMORY 引擎 → tmpdir 的 MyISAM 文件
备注:避免使用 InnoDB 临时表防止临时数据占用过多的innodb buffe
条件 存储引擎 内存位置 磁盘位置 说明
MySQL 8.0 默认 TempTable TempTable 内存池 无(纯内存) 小表默认情况
超过 temptable_max_ram TempTable TempTable 内存池(部分) temptable_use_mmap=ON → tmpdir temptable_use_mmap=OFF → #innodb_temp 大表溢出
包含 BLOB/TEXT TempTable 可能无 temptable_use_mmap=ON → tmpdir temptable_use_mmap=OFF → #innodb_temp BLOB 直接到磁盘
指定 ENGINE=MEMORY MEMORY MEMORY 引擎内存池 无(除非转换) 传统方式
指定 ENGINE=InnoDB InnoDB InnoDB 缓冲池 #innodb_temp 表空间 显式 InnoDB
MySQL 5.7 默认 MEMORY MEMORY 引擎内存池 超过 tmp_table_size → tmpdir 的 .frm/.MYD 文件 传统方式

溢出到磁盘的条件总结

条件:大小超过内存限制

引擎 内存参数 溢出条件 溢出目标
MEMORY tmp_table_size 表大小 > tmp_table_size 磁盘表(引擎由 default_tmp_storage_engine 决定)
TempTable temptable_max_ram 总使用 > temptable_max_ram temptable_use_mmap=ON → tmpdir mmap temptable_use_mmap=OFF → #innodb_temp
InnoDB 无专用限制 使用 InnoDB 缓冲池 缓冲池淘汰机制

8.generate tablespace

特性 独立表空间(file-per-table) 通用表空间(General Tablespace)
存储方式 每个表独立 .ibd 文件 多个表共享 .ibd 文件
管理 自动管理 手动创建和管理
空间利用 可能有碎片 更紧凑,减少碎片
移植性 容易(复制文件即可) 需要导出导入
MySQL 版本 5.6+(默认) 5.7.6+
创建表空间语法:
create tablespace tablespace_name
add datafile 'file_name'
[FILE_BLOCK_SIZE = value] 只能在压缩表的时候才需要
[engine [=] engine_name]

9.undo tablespace

[mysqld]
# Undo Log 优化配置
innodb_undo_tablespaces = 8
innodb_max_undo_log_size = 1073741824  # 1GB
innodb_undo_log_truncate = ON
innodb_undo_directory = /mnt/ssd/undo_logs  # 如果有多块盘
innodb_purge_threads = 4
innodb_rollback_segments = 128
# 监控长事务
long_query_time = 2

相关推荐