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
|
| 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
编辑推荐:
- MYSQL INNODB 相关参数03-01
- MYSQL ENTERPRISE BACKUP03-01
- MYSQL8.4 mydumper03-01
- mysql shell03-01
- MYSQL8.4 MGR03-01
- SQL入门教程:从基础到精通,一篇搞定!03-01
- 第58期 MySQL数据库生产级备份XtraBackup备份03-01
- MySQL不高冷!数据界的“智能文件柜”,藏在每款APP背后03-01
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
