mysql的内存模型(一)

mysql内存的三个部分 pool buffer,additional pool buffer,log buffer

下边是缓冲区

mysql> show engine innodb status \G
*************************** 1. row ***************************
  Type: InnoDB
  Name: 
Status: 
=====================================
2017-11-18 11:06:52 0x70000ed48000 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 43 seconds

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 290846
Buffer pool size   8192 --缓冲区 8192页 每页16k =下边的Free buffers +Database pages
Free buffers       7746 --空闲页
Database pages     446 --已经使用掉的缓冲区 分为2部分,新数据区和旧数据区(下边的Old database pages),
                         区别是前者是常访问的数据,后者是不常访问的数据
Old database pages 0  --旧数据区
Modified db pages  0  --脏页,已写入数据,但是没写入硬盘表空间
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 411, created 35, written 37
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: 446, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

Buffer pool size=空闲页(Free buffers)+数据页(Database pages)

每页16k

下边是插入缓存和自适应哈希

-------------------------------------
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 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---

线程 分为后台线程 和io线程

后台线程

-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 1 srv_active, 0 srv_shutdown, 387535 srv_idle
srv_master_thread log flush and writes: 387535
----------

io线程

--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
453 OS file reads, 54 OS file writes, 7 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------

其中pool buffer 分为数据页(data page),插入缓存(insert buffer ),锁信息(log info) ,索引页(index page ),自适应哈希索引,数据字典信息

buffer poll分为三种page,free page ,clean page,dirty page

数据页按照每页16k,数据页发生修改后就是变成脏页,脏页按照一定的频率刷新(flush)到文件

每张表的表空间内存放的只是数据、索引和插入缓冲,其他类的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。

参考文献

https://www.cnblogs.com/jiangxu67/p/3765708.html
http://book.51cto.com/art/201402/429092.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL内存模型主要包括以下几个部分: 1. 查询缓存(Query Cache):MySQL的查询缓存用于存储已经执行过的查询结果。当一个查询被执行时,MySQL会先检查是否有相同的查询已经被执行过并且结果仍然有效,如果是,则直接从缓存返回结果,避免了重复执行相同的查询。但是,查询缓存在高并发情况下性能不佳,并且容易导致缓存失效,所以在MySQL 8.0版本开始已经被标记为弃用。 2. 连接缓存(Connection Pool):连接缓存用于管理数据库与客户端的连接。当一个客户端请求连接到数据库时,MySQL会从连接缓存获取一个空闲连接,如果没有空闲连接,则会创建一个新的连接。连接缓存可以提高连接的创建和关闭效率,减轻服务器的负担。 3. 锁与锁管理:MySQL通过锁机制来实现并发控制,保证数据的一致性和完整性。MySQL支持多种类型的锁,如表级锁、行级锁和页级锁。锁管理组件负责管理和分配锁资源,并处理锁冲突。 4. 缓冲池(Buffer Pool):缓冲池是MySQL内存最重要的组件之一,用于缓存数据页。数据页是MySQL存储引擎最小的读写单位,缓冲池通过预先将热数据加载到内存,减少了磁盘IO操作,提高了数据库的读取性能。 5. 排序缓冲区(Sort Buffer):排序缓冲区用于执行排序操作,如ORDER BY和GROUP BY。当排序操作无法在内存完成时,会使用磁盘临时文件进行排序。 6. 重做日志缓冲(Redo Log Buffer):重做日志缓冲用于缓存事务执行过程所产生的重做日志。重做日志是MySQL用于实现事务的持久性和恢复能力的关键组件之一。 这些组件共同构成了MySQL内存模型,有效地管理和利用内存资源,提升数据库的性能和并发控制能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值