Skip to content

Commit 4debfde

Browse files
committed
Update Java Notes
1 parent be312e3 commit 4debfde

File tree

4 files changed

+544
-155
lines changed

4 files changed

+544
-155
lines changed

DB.md

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5320,7 +5320,7 @@ Buffer Pool 中每个缓冲页都有对应的控制信息,包括表空间编
53205320
MySQL 提供了缓冲页的快速查找方式:**哈希表**,使用表空间号和页号作为 Key,缓冲页控制块的地址作为 Value 创建一个哈希表,获取数据页时根据 Key 进行哈希寻址:
53215321

53225322
* 如果不存在对应的缓存页,就从 free 链表中选一个空闲缓冲页,把磁盘中的对应页加载到该位置
5323-
* 如果存在对应的缓存页,直接获取使用
5323+
* 如果存在对应的缓存页,直接获取使用,提高查询数据的效率
53245324

53255325

53265326

@@ -5419,6 +5419,8 @@ Innodb 用一块内存区做 IO 缓存池,该缓存池不仅用来缓存 Innod
54195419
SHOW ENGINE INNODB STATUS\G
54205420
```
54215421

5422+
`Buffer pool hit rate` 字段代表**内存命中率**,表示 Buffer Pool 对查询的加速效果
5423+
54225424
核心参数:
54235425

54245426
* `innodb_buffer_pool_size`:该变量决定了 Innodb 存储引擎表数据和索引数据的最大缓存区大小,默认 128M
@@ -5441,8 +5443,6 @@ SHOW ENGINE INNODB STATUS\G
54415443
innodb_log_buffer_size=10M
54425444
```
54435445

5444-
Buffer Pool 中有一块内存叫 Change Buffer 用来对增删改操作提供缓存,可以通过参数 innodb_change_buffer_max_size 来动态设置,设置为 50 时表示 Change Buffer 的大小最多只能占用 Buffer Pool 的 50%
5445-
54465446
在多线程下,访问 Buffer Pool 中的各种链表都需要加锁,所以将 Buffer Pool 拆成若干个小实例,每个实例独立管理内存空间和各种链表(类似 ThreadLocal),多线程访问各实例互不影响,提高了并发能力
54475447

54485448
* 在系统启动时设置系统变量 `innodb_buffer_pool_instance` 可以指定 Buffer Pool 实例的个数,但是当 Buffer Pool 小于 1GB 时,设置多个实例时无效的
@@ -5456,6 +5456,30 @@ MySQL 5.7.5 之前 `innodb_buffer_pool_size` 只支持在系统启动时修改
54565456

54575457

54585458

5459+
***
5460+
5461+
5462+
5463+
#### 其他内存
5464+
5465+
InnoDB 管理的 Buffer Pool 中有一块内存叫 Change Buffer 用来对**增删改**操作提供缓存,参数 `innodb_change_buffer_max_size ` 来动态设置,设置为 50 时表示 Change Buffer 的大小最多只能占用 Buffer Pool 的 50%
5466+
5467+
Server 层针对优化**查询**的内存为 Net Buffer,内存的大小是由参数 `net_buffer_length`定义,默认 16k,实现流程:
5468+
5469+
* 获取一行数据写入 Net Buffer,重复获取直到 Net Buffer 写满,调用网络接口发出去
5470+
* 若发送成功就清空 Net Buffer,然后继续取下一行;若发送函数返回 `EAGAIN``WSAEWOULDBLOCK`,表示本地网络栈 `socket send buffer` 写满了,进入等待,直到网络栈重新可写再继续发送
5471+
5472+
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-查询内存优化.png)
5473+
5474+
MySQL 采用的是边算边发的逻辑,因此对于数据量很大的查询来说,不会在 Server 端保存完整的结果集,如果客户端读结果不及时,会堵住 MySQL 的查询过程,但是不会把内存打爆导致 OOM
5475+
5476+
5477+
5478+
5479+
参考文章:https://blog.csdn.net/qq_33589510/article/details/117673449
5480+
5481+
5482+
54595483

54605484

54615485
***

0 commit comments

Comments
 (0)