关于后端:InnoDB体系架构

7次阅读

共计 2975 个字符,预计需要花费 8 分钟才能阅读完成。

1、InnoDB 体系架构

下图简略显示了 InnoDB 的存储引擎的体系架构,能够认为这些内存块组成了一个大的内存池,负责如下工作

<center>InnoDB 存储引擎体系架构 </center>

  • 保护所有过程 / 线程须要拜访的多个外部数据结构
  • 存储磁盘上的数据,不便疾速地读取,同时在对磁盘文件的数据批改之前在这里缓存
  • 重做日志(redo log)缓冲
  • 后盾线程的次要作用是负责刷新内存池中的数据,保障缓冲池中的内存缓存的是最近的数据,此外将已批改的数据文件刷新到磁盘文件,同时保障在数据库产生异样的状况下 InnoDB 能复原到失常运行状态

    1、后盾线程

    InnoDB 存储引擎是多线程的模型,因而其后盾有多个不同的线程,负责解决不同的工作

    1、Master Thread

    Master Thread 是一个十分外围的后盾线程,次要负责将缓存池中的数据异步刷新到磁盘,保证数据的一致性,包含脏页的刷新、合并插入缓冲(Insert Buffer)、undo 页的回收

    2、IO Thread

    在 InnoDB 存储引擎中大量应用了 AIO(Async IO) 来解决写 IO 申请,这样能够进步数据库的性能,而 IO Thread 的工作次要是负责 IO 申请的回调解决

    mysql> show variables like 'innodb_%_threads';
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | innodb_purge_threads    | 1     |
    | innodb_read_io_threads  | 1     |
    | innodb_write_io_threads | 1     |
    +-------------------------+-------+
    3、Purge Thread

    当事务被提交之后,其应用的 undolog 可能不再须要,因而须要应用 Purge Thread 来回收曾经应用的并调配的 undo 页,用户能够在 MySQL 数据库的配置文件中增加命令来启动独立的 Purge Thread

    mysql> show variables like 'innodb_purge_threads';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | innodb_purge_threads | 1     |
    +----------------------+-------+
    1 row in set (0.00 sec)
    4、Page Cleaner Thread

    Page Cleaner Thread 是将之前版本中脏页的刷新操作都放入到独立的单线程中来实现,目标是为了加重原 Master Thread 的工作对于用户查问线程的阻塞进一步提高 InnoDB 存储引擎的性能

    2、内存
    1、缓存池

    InnoDB 存储引擎是基于磁盘存储的,并将其中的记录依照页的形式进行治理,缓存池简略来说就是一块内存区域,通过内存的速度来补救磁盘速度较慢对数据库性能的影响,在数据库进行读取页的操作时,首先将从磁盘读到的页寄存在缓存池中,下一次再读雷同的页时,首先判断该页是否在缓冲池中,若在缓冲池中,称该页在缓冲池中被命中,间接读取该页。否则,读取磁盘上的页。

    对于数据库中的页的批改操作,则首先批改在缓冲池中的页,而后在以肯定的效率刷新到磁盘上,页从缓冲池中刷新回磁盘的操作并不是在每次页产生更新时触发,而是通过 Checkpoint 的机制刷新回磁盘,也是为了进步数据库的整体性能。而缓冲池的大小为

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

    缓冲池中缓存的数据页类型有: 索引页、数据页、undo 页、插入缓冲(insert buffer)、自适应哈希索引、InnoDB 存储的锁信息(lock info)、数据字典信息等、缓冲池中缓存索引页和数据页只是占了缓冲池中的很大一部分而已,如下图所示

    <center>InnoDB 内存数据对象 </center>

2、LRU List、Free List 和 Flush List

咱们晓得缓冲池是一个很大的内存构造,其中寄存各种类型的页,那么 InnoDB 存储引擎是如何治理这些内存区域的呢?

数据库中的缓冲池是通过 LRU(Latest Recent Used, 最近起码应用)算法来治理的,即最频繁应用的页在 LRU 列表的前端,而起码应用的页在 LRU 列表的尾端,当缓冲池不能寄存读取到最新的页时,将首先开释 LRU 列表中尾端的页。

在 InnoDB 贮存引擎中,缓冲池中页的大小默认为 16KB,同样应用 LRU 算法对缓冲池进行治理,不同的是 InnoDB 存储引擎对传统的 LRU 算法做了一些优化,在 InnoDB 的存储引擎中,LR 列表中还退出了 midpoint 地位,新读取到的页,尽管是最新拜访的页,但并不是间接放入到 LRU 列表的首部,而是放入到 LRU 列表中的 midpoint 地位

3、重做日志缓冲

InnoDB 存储引擎的内存区域除了有缓冲池外,还有重做日志缓冲(redo log buffer),InnoDB 存储引擎首先将重做日志信息放入到缓冲区,而后按肯定频率将其刷新到重做日志文件,该值可有配置参数 innodb_log_buffer_size 管制

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

重做日志在以下状况下会将重做日志缓冲中的内容刷新到内部磁盘的重做日志文件中去

  • Master Thread 每一秒将重做日志缓冲刷新到重做日志文件
  • 每个事务提交时将重做日志缓冲刷新到重做日志文件
  • 当重做日志缓冲池残余空间小于 1 / 2 时,重做日志缓冲刷新到重做日志文件
4、额定的内存池

在 InnoDB 存储引擎中,对内存的治理是通过一种称之为内存堆(heap) 的形式进行的,在对一些数据结构自身的内存进行调配时,须要从额定的内存池中进行申请,当该区域的内存不够时,会从缓冲池中进行申请,例如,调配了缓冲池(innodb_buffer_pool), 然而每个缓冲池中的帧缓冲(frame buffer) 还有对应的缓冲管制对象(buffer control block), 这些对象记录了一些诸如 LRU、锁、期待等信息,而这个对象的内存须要从额定内存池中申请。

2、Checkpoint 技术

正文完
 0