InnoDB存储引擎——内存

MySQL之服务器配置:InnoDB存储引擎与内存优化策略 在MySQL的学习与实践中,服务器配置是影响其性能与稳定性的关键因素,而InnoDB存储引擎的配置又是其中的重中之重。在探索这部分知识的过程中,我积累了不少经验,也遇到过一些问题,今天就想和大家分享一下,希望能和大家一起学习进步,更深入地掌握MySQL服务器配置的要点。 阅读详情

这里写图片描述

上图是InnoDB存储引擎的结构。

1、缓冲池

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的性能。

缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库进行读取页的操作时,首先将从磁盘读取的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页是,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘中。但是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新回磁盘。这是为了提高数据库的整体性能。

可以通过下面的方式查看MySql数据库服务器中InnoDB存储引擎的缓冲池设置的大小,从结果可以看出大小为134MB左右。

mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

缓冲池中缓存的数据类型有:索引页,数据页,undo页,插入缓冲,自适应哈希索引,InnoDB存储的锁信息,数据字典信息等。

下面是InnoDB存储引擎中内存的结构:
这里写图片描述

InnoDB存储引擎中允许有多个缓冲池实例。每个页根据哈希值平均分配到不同缓冲池实例中。这样可以减少数据库内部的资源竞争,增加数据库的并发处理能力。可以通过设置参数innodb_buffer_pool_instances来进行配置,下面可以看到该值默认是1。

mysql> show variables like 'innodb_buffer_pool_instances';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1     |
+------------------------------+-------+
1 row in set (0.00 sec)

2、LRU List、Free List和Flush List

缓冲池是一个很大的内存区域,其中存放了各种类型的页。那么InnoDB存储引擎是怎么对其进行管理的呢?

  • LRU List

数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的。即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中尾部的页。

InnoDB存储引擎中,缓冲池中页的大小默认是16KB,同样使用LRU算法对缓冲池进行管理。不过,InnoDB存储引擎对传统的LRU算法做了一些优化。
在InnoDB存储引擎中,LRU列表中还加入了midpoint位置。也就是说,新读取到的页,不是直接放入到LRU列表的首部,而是放入到LRU列表的midpoint位置。
这个算法在InnoDB存储引擎中称为midpoint insertion strategy。在默认配置下,该位置为LRU列表长度的5/8处。midpoint位置由参数innodb_old_blocks_pct控制,下面可以查看该值:

mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37    |
+-----------------------+-------+
1 row in set (0.00 sec)

innodb_old_blocks_pct默认是37,表示新读取的页插入到LRU列表尾部的37%的位置(其实就是距离尾部3/8的位置,距离首部5/8的位置)。把midpoint之后的LRU列表称为old列表,之前的列表称为new列表。可以简单地理解为new列表中的页都是最为活跃的热点数据。

为什么不用朴素的LRU算法,直接将读取的页放入到LRU列表的首部呢?
如果直接将读取的页放入到LRU的首部,会影响缓冲池的效率。比如,索引或数据的扫描操作需要访问表中的许多页,但是这些页仅仅是在本次查询时需要,它们并不是活跃的热点数据。所以,如果把这些非热点数据页直接放入LRU列表的首部,那么非常可能会把之前的热点数据页重LRU列表中移除,那么,在下一次需要读取该页的时候,InnoDB存储引擎需要再次访问磁盘。

InnoDB存储引擎引入另一个参数innodb_old_blocks_time,该参数用来表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端,也就是LRU列表的new列表。如果增加innodb_old_blocks_time的值,那么会使LRU列表的热点数据不那么快被换出。

mysql> show variables like 'innodb_old_blocks_time';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_old_blocks_time | 0     |
+------------------------+-------+
1 row in set (0.00 sec)

mysql> set global innodb_old_blocks_time=1000;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'innodb_old_blocks_time';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_old_blocks_time | 1000  |
+------------------------+-------+
1 row in set (0.00 sec)

如果活跃的热点数据比较多,可能大于63%,除了上面增加innodb_old_blocks_time的值外,还可以减少innodb_old_blocks_pct的值来减少热点数据被换出的概率。减少innodb_old_blocks_pct的值使得midpoint的位置后移,new列表的长度增加。

mysql> 
mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37    |
+-----------------------+-------+
1 row in set (0.00 sec)

mysql> set global innodb_old_blocks_pct=20;        
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'innodb_old_blocks_pct';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 20    |
+-----------------------+-------+
1 row in set (0.00 sec)
  • Free List

LRU列表是用来管理已经读取的页,但是当数据库刚刚启动时,LRU列表是空的,即没有任何的页。这时页都存放在Free列表中,也就是说,用Free列表来管理所有的空闲页。

当需要从缓冲池中分页时,首先从Free列表中查找是否有可用的空闲页,若有则将该页从Free列表中删除,放入到LRU列表中。如果Free列表中没有可用的空闲页,则根据LRU算法,淘汰LRU列表末尾的页,将该内存空间分配给新的页。

当从LRU列表的old部分加入到new部分时,称此时发生的操作为page made young,而因为innodb_old_blocks_time的设置为导致页没有从old部分移动到new部分的操作称为page not made young。

通过下面的命令可以查看LRU列表和Free列表的使用情况和运行状态:

mysql> show engine innodb status\G

下面是部分输出:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 256619
Buffer pool size   8191
Free buffers       7734
Database pages     457
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 457, created 0, written 0
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: 457, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

可以看出当前Buffer pool size共有8191个页,即8192*16K,共128M的缓冲池。
Free buffers 表示当前Free列表中页的数量为:7734
Database pages表示LRU列表中页的数量为:457
(Free buffers 和Database pages的总和可能不等于Buffer pool size,因为缓冲池中的页还可能会分配给自适应哈希索引、Lock信息、Insert Buffer等页,这部分的页不需要LRU算法进行维护,因此不存在于LRU列表中。)

Pages made young显示了LRU列表中页移动到前端的次数。
innodb_old_blocks_time的设置为导致页没有从old部分移动到new部分的操作称为page not made young。因为没有设置innodb_old_blocks_time,所以not young等于0。
youngs/s, non-youngs/s分别表示每秒这两类操作的次数。

No buffer pool page gets since the last printout,表示没有数据从缓冲池中获取。如果有的话,会显示变量Buffer pool hit rate,表示缓冲池的命中率。

上面的结果不是当前的状态,而是过去36秒内的平均值。下面的语句是命令输出的前面的一行提示:

Per second averages calculated from the last 36 seconds

从InnoDB 1.2版本开始,还可以通过INNODB_BUFFER_POOL_STATUS来观察缓冲池的运行状态,如下面的命令:

mysql> use information_schema;
Database changed
mysql> SELECT * FROM INNODB_BUFFER_POOL_STATS\G
*************************** 1. row ***************************
                         POOL_ID: 0
                       POOL_SIZE: 8191
                    FREE_BUFFERS: 7734
                  DATABASE_PAGES: 457
              OLD_DATABASE_PAGES: 0
         MODIFIED_DATABASE_PAGES: 0
              PENDING_DECOMPRESS: 0
                   PENDING_READS: 0
               PENDING_FLUSH_LRU: 0
              PENDING_FLUSH_LIST: 0
                PAGES_MADE_YOUNG: 0
            PAGES_NOT_MADE_YOUNG: 0
           PAGES_MADE_YOUNG_RATE: 0
       PAGES_MADE_NOT_YOUNG_RATE: 0
               NUMBER_PAGES_READ: 457
            NUMBER_PAGES_CREATED: 0
            NUMBER_PAGES_WRITTEN: 0
                 PAGES_READ_RATE: 0
               PAGES_CREATE_RATE: 0
              PAGES_WRITTEN_RATE: 0
                NUMBER_PAGES_GET: 7653
                        HIT_RATE: 0
    YOUNG_MAKE_PER_THOUSAND_GETS: 0
NOT_YOUNG_MAKE_PER_THOUSAND_GETS: 0
         NUMBER_PAGES_READ_AHEAD: 0
       NUMBER_READ_AHEAD_EVICTED: 0
                 READ_AHEAD_RATE: 0
         READ_AHEAD_EVICTED_RATE: 0
                    LRU_IO_TOTAL: 0
                  LRU_IO_CURRENT: 0
                UNCOMPRESS_TOTAL: 0
              UNCOMPRESS_CURRENT: 0
1 row in set (0.00 sec)

还可以通过INNODB_BUFFER_PAGE_LRU表来观察每个LRU列表中每个页的具体信息。

mysql> select * from INNODB_BUFFER_PAGE_LRU\G

下面是命令的输出的最后两行:

*************************** 456. row ***************************
            POOL_ID: 0
       LRU_POSITION: 455
              SPACE: 0
        PAGE_NUMBER: 658
          PAGE_TYPE: INDEX
         FLUSH_TYPE: 0
          FIX_COUNT: 0
          IS_HASHED: NO
NEWEST_MODIFICATION: 0
OLDEST_MODIFICATION: 0
        ACCESS_TIME: 3374755154
         TABLE_NAME: ch9/operate
         INDEX_NAME: op_id
     NUMBER_RECORDS: 4
          DATA_SIZE: 36
    COMPRESSED_SIZE: 0
         COMPRESSED: NO
             IO_FIX: IO_NONE
             IS_OLD: NO
    FREE_PAGE_CLOCK: 0
*************************** 457. row ***************************
            POOL_ID: 0
       LRU_POSITION: 456
              SPACE: 0
        PAGE_NUMBER: 654
          PAGE_TYPE: INDEX
         FLUSH_TYPE: 0
          FIX_COUNT: 0
          IS_HASHED: NO
NEWEST_MODIFICATION: 0
OLDEST_MODIFICATION: 0
        ACCESS_TIME: 3374755155
         TABLE_NAME: ch9/trigger_time
         INDEX_NAME: GEN_CLUST_INDEX
     NUMBER_RECORDS: 4
          DATA_SIZE: 132
    COMPRESSED_SIZE: 0
         COMPRESSED: NO
             IO_FIX: IO_NONE
             IS_OLD: NO
    FREE_PAGE_CLOCK: 0
457 rows in set (0.00 sec)
  • unzip_LRU列表

InnoDB存储引擎从1.0.x版本开始支持压缩页的功能,即将原本16KB的页压缩为1KB,2KB,4KB,8KB。而由于页的大小发生了变化,LRU列表也有了一些变化。对于非16KB的页,是通过unzip_LRU列表进行管理的。
通过下面命令可以查看:

mysql> show engine innodb status\G

下面是部分输出:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 256619
Buffer pool size   8191
Free buffers       7734
Database pages     457
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 457, created 0, written 0
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: 457, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

可以看到LRU列表有457个页,而unzip_LRU列表中没有页。需要注意的是,LRU中的页包含了unzip_LRU列表中的页。

对于压缩页的表,每个表的压缩比率可能不一样。有的表页大小为8K,有的可能是2K。那么unzip_LRU是怎样从缓冲池中分配内存的呢?
首先,在unzip_LRU列表中对不同压缩页大小的页进行分别管理。其次,通过伙伴算法进行内存的分配。例如,对需要从缓冲池中申请页为4K的大小,其过程如下:
1)检查4K的unzip_LRU列表,检查是否有可用的空闲页;
2)若有,则直接使用;
3)否则,检查8K的unzip_LRU列表;
4)若能够得到空闲页,将页分成2个4KB的页,存放到4K的unzip_LRU列表;
5)若不能得到空闲页,从LRU列表中申请一个16K的页,将页分为1个8K的页,2个4K的页,分别存放到对应的unzip_LRU列表中。

可以通过INNODB_BUFFER_PAGE_LRU表来看哪些页的COMPRESSED_SIZE不等于0。如果不等于0,则表示该页是unzip_LRU列表的页。

  • Flush列表
    在LRU列表中的页被修改之后,称该页为脏页,即缓冲池中的页和磁盘上的页的数据发生了不一致。这时数据库会通过Checkpoint机制将脏页刷新回磁盘,而Flush列表中的页即为脏页列表。需要注意的是,脏页既存在于LRU列表中,也存在于Flush列表中。LRU列表用来管理缓冲池中页的可用性,Flush列表用来管理将页刷新回磁盘,二者互不影响。

通过下面命令查看:

mysql> show engine innodb status\G

下面是命令的部分输出:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 256619
Buffer pool size   8191
Free buffers       7734
Database pages     457
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 457, created 0, written 0
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: 457, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

其中Modified db pages 显示的是脏页的数量。

3、重做日志缓冲

InnoDB存储引擎的内存区域除了有缓冲池外,还有重做日志缓冲(redo log buffer)。InnoDB存储引擎首先将重做日志信息先放入到这个缓冲区,然后将其按一定频率刷新到重做日志文件中。
重做日志缓冲一般不需要设置很大,因为一般情况下每一秒钟会将重做日志缓冲刷新到日志文件,因此用户只需要保证每秒产生的事务量在这个缓冲大小之内即可。该值可由配置参数innodb_log_buffer_size控制,默认是8MB。

mysql> show variables like 'innodb_log_buffer_size';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| innodb_log_buffer_size | 8388608 |
+------------------------+---------+
1 row in set (0.00 sec)

通常情况下,8MB的重做日志缓冲池足以满足绝大部分的应用,因为重做日志在下列三种情况下会做重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中。
1)Master Thread每一秒将重做日志缓冲刷新到重做日志文件;
2)每个事务提交时会将重做日志缓冲刷新到重做日志文件;
3)当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件;

4、额外的内存池

额外的内存池通常被DBA忽略。
在InnoDB存储引擎中,对内存的管理是通过一种称为内存堆的方式进行的。在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请。
比如,分配了缓冲池,但是每个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录了一些诸如LRU、锁、等待等信息,而这个对象的内存需要从额外内存池中申请。因此,在申请了很大的InnoDB缓冲池时,也应考虑相应地增加这个值。

第73讲:深入理解MySQL数据库InnoDB存储引擎:内存结构、磁盘结构与后台线程全面解析 如下图所示:用户操作数据库表中的数据时,首先在内存结构的缓冲区里找到对应的数据,如果缓冲区中没有要处理的数据,那么会从磁盘的表空间文件里加载数据到缓冲区,当我们增删改查时,都是在缓冲区里操作的,当数据处理完毕后,经过一定的频率通过一组后台线程,将数据刷新到磁盘中的表空间里,进行数据的持久化。系统表空间是Change Buffer更改缓冲区的存储区域,更改缓冲区中的数据都在系统表空间中,如果MySQL系统中的表没有自己独立的表空间文件,或者也没有使用通用表空间,此时系统表空间就是该表的表空间。 阅读详情

相关推荐

半导体EAP系统入门指南:从零开始理解设备自动化程序(附实战案例)

本文深入浅出地介绍了半导体制造中EAP(设备自动化程序)系统的核心作用与工作原理。EAP作为连接MES与生产设备的桥梁,负责指令翻译、数据采集与实时控制,是实现晶圆厂全自动化的关键。文章通过对比手动与自动模式,阐述了EAP在提升效率、保障良率方面的价值,并提供了一个实战案例,帮助读者从零构建对半导体CIM体系中这一关键组件的理解。

weixin_29200741的博客 738

InnoDB关键特性,innodb_old_blocks_time,锁,内存管理,latch争用

InnoDB存储引擎的关键特性包括: - 插入缓冲(Insert Buffer) - 两次写(Double Write) - 自适应哈希索引(Adaptive Hash Index) - 异步IO(Async IO) - 刷新临接页(Flush Neighbor Page)

阿鹏的笔记 9229

HTB Attacking GraphQL Skills Assessment

通过枚举应用,利用GraphQL API,发现sql注入点,然后利用找到flag。

qq_33522010的博客 453

MySQL技术内幕-InnoDB存储引擎-第二章、InnoDB存储引擎

文章目录InnoDB存储引擎一、InnoDB存储引擎概述二、InnoDB存储引擎的版本三、InnoDB体系架构1、后台线程Master Thread(主要负责将缓存池数据刷新到磁盘)IO Thread(主要负责写IO请求的回调处理) InnoDB存储引擎 InnoDB是事务安全的MySQL存储引擎,通常来说,它是OLTP(Online Transactional Processing,联机事务处理)应用中核心表的首选存储引擎。 一、InnoDB存储引擎概述 从MySQL5.5版本开始,InnoDB开始是默认

weixin_38367817的博客 1278

《QGIS快速入门与应用基础》【专栏完整目录】

《QGIS快速入门与应用基础》第一卷专栏完整目录,覆盖 001–328 全部篇目与附录,逐篇可跳转。

LuckyHanMo的博客 1302

2026AI漫剧放心大胆做!小白也能轻松出片(附保姆级教程)

要是在2025,我大概率会劝他再等等,毕竟那时工具还没这么顺手。但到了2026年的今天,我的回答得很干脆:放心去做,绝对没问题。这一年多来,AI漫剧这块的变化真可谓翻天覆地。过去你想拍个像样的短片,哪怕再简陋,也得凑齐拍摄设备、找场地、找演员,后期剪辑更是折磨。但现在,时代变了,AI已经把创作的门槛踏平了。你不需要请演员,也不用操心灯光布景,更不用为剪辑特效烧钱。一个人,一台电脑,花几天时间就能做一部完整的AI漫剧。你只要有有想表达的故事,突发的灵感,剩下的,都能直接交给AI落地。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 534

控制InnoDB LRU链表的两个参数------innodb_old_blocks_time和innodb_old_blocks_pct

innodb_old_blocks_time和innodb_old_blocks_pct innodb_old_blocks_pct: 1)全局、动态变量,默认值 37,取值范围为5~95。 2)Specifies the approximate percentage of the InnoDB buffer pool used for the old block sublist...

jzzw的博客 2976

YOLO26改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下: 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检测头对应的经过了更多的下采样操作,相比P3/

Limiiiing的博客 353

MYSQL buffer pool and memory解析

show engine innodb status; BUFFER POOL AND MEMORY BUFFER POOL AND MEMORY ---------------------- Total large memory allocated 549715968 Dictionary memory allocated 12276417 Buffer pool size 32764 Free buffers 1024 Database pages 31621 Old da.

liu911025的博客 1601

UNet 改进(27):结合SCSE注意力机制的UNet网络实现

本文介绍了一种结合SCSE注意力机制的改进UNet网络架构。该网络在保持UNet经典编码器-解码器结构基础上,通过在每层添加SCSEBlock模块,融合了通道注意力和空间注意力机制。通道注意力通过全局池化和1×1卷积生成通道权重,空间注意力则产生空间权重图,二者相加增强关键特征响应。该设计具有以下优势:1)保持原始UNet的多尺度特征提取能力;2)通过注意力机制提升对重要区域的关注度;3)计算效率高,仅增加少量参数。测试显示网络能保持输入输出分辨率不变,适用于医学图像分割等像素级预测任务。完整代码实现了5层

2401_82355416的博客 415

华为OD机试真题 新系统【优化充电桩调度算法】

华为OD机试 新系统真题【优化充电桩调度算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【优化充电桩调度算法】

qq_45776114的博客 756

每日一参数--innodb_old_blocks_pct、innodb_old_blocks_time理解

innodb缓存池有2个区域一个是sublist of old blocks存放不经常被访问到的数据,另外一个是sublist of new blocks存放经常被访问到的数据 innodb_old_blocks_pct参数是控制进入到sublist of old blocks区域的数量,初始化默认是37. innodb_old_blocks_time参数是在访问到sublist of o

隔壁wangshifu的博客 5239

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1382

innodb存储引擎之内存

1、innoDB存储引擎体系架构      如上图所示,innoDB存储是基于磁盘存储的,并且其中的记录以页的方式进行管理,但为什么要引入一个内存池呢?   其目的就是为了协调CUP速度与磁盘速度的鸿沟,基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的整体性能(简单来说就是通过内存的速度来弥补磁盘速度较慢对数据库性能的影响) 2、内存池的管理   既然内存池能提高数据库的...

weixin_30409849的博客 184

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL InnoDB存储引擎的内存及其管理

MySQL InnoDB存储引擎的内存及其管理       作为一个支持事物的的存储引擎,InnoDB存储引擎有着极其广泛的应用,因为事物的复杂性,也导致了关系型数据库的内存管理的复杂性,本文就是来研究一下InnoDB存储引擎的内存的使用,以及其管理的方式。InnoDB的内存可以分为三大块,buffer pool,redo log_buffer和额外内存池,它们的关系如下图所示: 从上图中

ll1058320115的博客 742

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MySQL InnoDB存储引擎内存管理

作为一个支持事物的的存储引擎,InnoDB存储引擎有着极其广泛的应用,因为事物的复杂性,也导致了关系型数据库的内存管理的复杂性,本文就是来研究一下InnoDB存储引擎的内存的使用,以及其管理的方式 ...

滕柳 330

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

InnoDB 存储引擎<三>内存结构

InnoDB内存结构介绍

Miwll的博客 1114

InnoDB存储引擎内存结构简介

这四个部分都是需要记住并且研究透彻的,但是本文不详细展开,知道InnoDB的内存结构是由这4部分组成就行了。具体每部分的详细介绍,后续文章讲。先看一张 InnoDB 存储引擎的整体结构图,从大方向上说包含2部分:内存结构、磁盘结构。本文要介绍的是上图中左侧部分:In-Memory Structures。可以看出,内存结构是由四个部分组成的,分别是。

杂货铺的小掌柜 272

InnoDB存储引擎-内存-缓冲池

概述 InnoDB存储引擎是基于磁盘存储的, 并将其记录按照页的方式进行管理. 而磁盘IO与内存IO的速度相差可能接近1000倍, 所以使用缓冲池(Buffer Pool)可以有效提高响应能力. 当数据库需要进行数据页读取的时候, 先将页数据存储在缓冲池中, 下一次再读取的时候, 先检查缓冲池中是否存在数据, 如果存在则称为命中(hit), 否则会读取磁盘上的页. 为了提高大容量读取的效率, 缓冲...

a1158375969的专栏 366

【MySQL数据库】InnoDB存储引擎:逻辑存储结构、内存架构、磁盘架构

一个数据库是由一张张表组成的,而表中是由一个个段构成的,一个段是由区构成的,区空间是由页构成的,页是行构成的。:.ibd文件,一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。:分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子结点,索引段就是B+树的非叶子结点。段用来管理多个Extent(区)。:表空间的单元结构,每个区大小为1M。

Stark的博客 1902

Mysql存储引擎——InnoDB内存结构

MySQL运行机制

LiZhiToDianFeng的博客 279

【MySQL】InnoDB存储引擎内存结构之buffer pool详解

InnoDB架构官方给出的架构图如下图所示。可以看出InnoDB存储引擎主要分为内存结构和磁盘结构。其中这篇博客先来介绍一下内存结构中的Buffer Pool。

关关的博客 1796

InnoDB存储引擎读书笔记-内存

InnoDB存储引擎内存管理相关整理。

zuimrs的博客 157

InnoDB存储引擎内存模型与磁盘同步

InnoDB存储引擎内存模型与磁盘同步

weixin_43183107的博客 314

MySQL:InnoDB 存储引擎(后台线程、缓冲池、重做日志缓冲、额外内存池)

asdsInnoDB 是事务安全的MySQL 存储引擎,设计上采用了类似于Oracle 数据库的架构。通常来说, InnoDB 存储引擎是OLTP应用中核心表的首选存储引擎。同时,也正是因为InnoDB 的存在,才使MySQL 数据库变得更有魅力。本章将详细介绍InnoDB 存储引擎的体系架构及其不同于其他存储引擎的特性。 asdsadasdasdasdsadasdasdasdsadassdasdsadasdasdsadasdsadassadasdas————《MySQL技术内幕INNODB存储引擎》 .

置身于量子事业的软件开发爱好者 722

mysql数据库之innodb存储引擎架构之内存架构

本文介绍了innodb存储引擎的逻辑存储结构,内存架构和磁盘结构和后台线程。

努力是为了让自己不平庸。。。 591
上一篇: InnoDB存储引擎——后台线程
下一篇: InnoDB存储引擎——Checkpoint技术
readyao
博客等级 码龄11年 243粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值