执行层(排序、Join、TempTable、缓冲池):PG 与 MySQL 内存对照。
一、InnoDB 内存结构(17.5)#
Buffer Pool 在启动时按 innodb_buffer_pool_size 通过 malloc() 分配整池(官方 17.5.1)。
二、mysqld 完整内存结构图#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
mysqld 进程
│
├─── InnoDB 存储引擎 ───────────────────────────────────────────
│ │
│ ├── Buffer Pool [17.5.1]
│ │ ├── 数据页 / 索引页(LRU: young + old sublist)
│ │ ├── Undo 页(undo tablespace 读入后作为普通 frame)
│ │ └── Change Buffer 相关页(IBUF_INDEX / IBUF_BITMAP)
│ │
│ ├── Change Buffer(逻辑结构,内存占 BP 份额) [17.5.2]
│ │
│ ├── Adaptive Hash Index (AHI) [17.5.3]
│ │
│ ├── Log Buffer → #innodb_redo [17.6.5]
│ │
│ ├── Doublewrite Buffer(内存)+ .dblwr 文件 [17.6.4]
│ │
│ └── Dictionary Cache 等
│
├─── SQL Server 层 ─────────────────────────────────────────────
│ ├── 每连接 THD:sort buffer、Join Buffer、Hash Join 表、
│ │ TempTable、Binlog Cache、mem_root …
│ └── 全局:Table Open/Definition Cache、PFS、权限缓存 …
│
└─── 磁盘:表空间、#innodb_redo、undo、doublewrite、binlog、tmpdir
|
三、redo / undo / 双写 / binlog 落在哪#
| 组件 |
MySQL 内存结构名 |
磁盘 |
PostgreSQL 对照 |
| Redo |
Log Buffer |
#innodb_redo |
WAL Buffers → pg_wal |
| Undo |
Buffer Pool 中的 undo 页 |
undo tablespace |
undo 文件 + 缓冲池中页 |
| Doublewrite |
Doublewrite Buffer + 文件 |
.dblwr 等 |
实现机制不同 |
| Binlog |
Binlog Cache |
binlog 文件 |
逻辑解码 / WAL |
| 热点数据页 |
Buffer Pool LRU young |
.ibd |
Shared Buffers |
四、PostgreSQL 平行结构图#
1
2
3
4
5
|
postgres 实例
├── 共享内存:Shared Buffers、WAL Buffers、锁 …
├── 每 backend:MemoryContext(Tuplesort、HashJoinTable…)、
│ local buffers(临时表)、pgsql_tmp
└── 磁盘:base/、pg_wal、表空间
|
五、执行层结构速查(与总图关系)#
| 场景 |
MySQL |
PostgreSQL |
| 排序 |
sort buffer |
Tuplesortstate |
| Hash Join |
Hash Join 哈希表 |
HashJoinTable |
| BNL |
Join Buffer |
— |
| GROUP BY / 物化 |
TempTable |
Materialize / HashAggregate |
| 表页 |
Buffer Pool |
Shared Buffers |
六、手册索引#
- 10.12.3.1 How MySQL Uses Memory
- 17.5 InnoDB In-Memory Structures
- 17.5.1 Buffer Pool
- 17.5.2 Change Buffer
- 17.5.3 Adaptive Hash Index
- 17.6.4 Doublewrite Buffer
- 17.6.5 Redo Log
- 10.4.4 Internal Temporary Tables