资讯专栏INFORMATION COLUMN

InnoDB 存储引擎体系架构

Lycheeee / 2244人阅读

摘要:首先以一张图简单展示的存储引擎的体系架构从图中可见存储引擎有多个内存块这些内存块组成了一个大的内存池主要负责如下工作维护所有进程线程需要访问的多个内部数据结构缓存磁盘上的数据方便快速读取同时在对磁盘文件修改之前进行缓存重做日志缓冲后台线程的

首先以一张图简单展示 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作:

维护所有进程/线程需要访问的多个内部数据结构

缓存磁盘上的数据, 方便快速读取, 同时在对磁盘文件修改之前进行缓存

重做日志(redo log)缓冲

后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最新数据;将已修改数据文件刷新到磁盘文件;保证数据库发生异常时 InnoDB 能恢复到正常运行 的状态

后台线程

InnoDB 使用的是多线程模型, 其后台有多个不同的线程负责处理不同的任务

1. Master Thread

这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等.

2. IO Thread

在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调.

可以通过命令来观察 InnoDB 中的 IO Thread:

mysql> SHOW ENGINE INNODB STATUSG
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2016-03-23 20:19:53 0x700000d51000 INNODB MONITOR OUTPUT
....
...
--------
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)
......
----------------------------
END OF INNODB MONITOR OUTPUT

可以看到, InnoDB 共有10个 IO Thread, 分别是 4个 write、4个 read、1个 insert buffer和1个 log thread.

3. Perge Thread

事物被提交之后, undo log 可能不再需要,因此需要 Purge Thread 来回收已经使用比分配的 undo页. InnoDB 支持多个 Purge Thread, 这样做可以加快 undo 页的回收
InnoDB 引擎默认设置为4个 Purge Thread:

mysql> SHOW VARIABLES LIKE "innodb_purge_threads"G
*************************** 1. row ***************************
Variable_name: innodb_purge_threads
        Value: 4
1 row in set (0.00 sec)
4. Page Cleaner Thread

Page Cleaner Thread 是新引入的,其作用是将之前版本中脏页的刷新操作都放入多带带的线程中来完成,这样减轻了 Master Thread 的工作及对于用户查询线程的阻塞

内存 1. 缓冲池

InnoDB 存储引擎是基于磁盘存储的,其中的记录按照页的方式进行管理,由于 CPU 速度和磁盘速度之间的鸿沟, InnoDB 引擎使用缓冲池技术来提高数据库的整体性能.

缓冲池简单来说就是一块内存区域.在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判断该页是不是在缓冲池中,若在,称该页在缓冲池中被命中,直接读取该页.否则,读取磁盘上的页.

对于数据库中页的修改操作,首先修改在缓冲池中页,然后再以一定的频率刷新到磁盘,并不是每次页发生改变就刷新回磁盘.

缓冲池的大小直接影响数据库的整体性能,对于 InnoDB 存储引擎而言,缓冲池配置通过参数 innodb_buffer_pool_size 来设置. 下面显示本机虚拟机上一台 MySQL 数据库配置:

mysql> SHOW VARIABLES LIKE "innodb_buffer_pool_size"G
*************************** 1. row ***************************
Variable_name: innodb_buffer_pool_size
        Value: 134217728
1 row in set (0.00 sec)

缓冲池中缓存的数据页类型有:索引页、数据页、 undo 页、插入缓冲、自适应哈希索引、 InnoDB 的锁信息、数据字典信息等.索引页和数据页占缓冲池的很大一部分.
下图显示 InnoDB 存储引擎总内存的结构情况.

2. 重做日志缓冲

InnoDB 存储引擎先将重做日志信息放入这个缓冲区,然后以一定频率将其刷新到重做日志文件.重做日志文件一般不需要设置得很大,因为在下列三种情况下重做日志缓冲中的内容会刷新到磁盘的重做日志文件中.

Master Thread 每一秒将重做日志缓冲刷新到重做日志文件

每个事物提交时会将重做日志缓冲刷新到重做日志文件

当重做日志缓冲剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件

3. 额外的内存池

在 InnoDB 存储引擎中, 对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请.例如,分配了缓冲池,但是每个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录以一些诸如 LRU, 锁,等待等信息,而这个对象的内存需要从额外的内存池中申请.

我的博客: http://ygmyth.github.io

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46638.html

相关文章

  • MySQL性能管理及架构设计(一):什么影响了数据库查询速度、什么影响了MySQL性能

    摘要:重启,并重建系统表空间。性能优化顺序从上到下下一篇性能管理及架构设计二数据库结构优化高可用架构设计数据库索引优化参考教学视频实战性能管理及架构设计 一、什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素     showImg(https://segmentfault.com/img/bV5m06?w=427&h=196); 1.2 风险分析 QPS:Queries Pe...

    XiNGRZ 评论0 收藏0
  • MySQL探秘(三):InnoDB的内存结构和特性

    摘要:页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为的机制刷新回磁盘。具体来看,缓冲池中缓存的数据页类型有索引页数据页页插入缓冲自适应哈希索引存储的锁信息和数据字典信息。 showImg(https://segmentfault.com/img/bVbex5v?w=750&h=562);  常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说...

    fevin 评论0 收藏0
  • 入门MySQL——架构

    摘要:本篇文章是在读完林晓斌老师的实战课程后所写,在这里也向大家推荐下这个课程,此课程由极客时间出品,是干货满满的专栏,看完绝对有收获。 前言:  上篇文章我们介绍了入门MySQL的基本概念,看完上篇文章,相信你应该了解MySQL的前世今生了吧。本篇文章将带你从架构体系来学习MySQL。我认为学习MySQL架构体系应该是入门阶段必须的,虽然可能看不太明白,暂时也用不到,但是我们心中要有这些概...

    jeffrey_up 评论0 收藏0
  • 读书笔记之MySQL技术内幕

    摘要:前言本文内容基本摘抄自技术内幕存储引擎,以供复习之用,没有多少参考价值。这样做是避免类似索引或数据的扫描操作会使缓冲池中的页被刷新出,从而影响缓冲池的效率。的操作发生在以下情况辅助索引页被读取到缓冲池时页追踪到该辅助索引页无可用空间。 前言 本文内容基本摘抄自《MySQL技术内幕 InnoDB存储引擎》,以供复习之用,没有多少参考价值。想要更详细了解请参考原书。 第一章.MySQL体系...

    fanux 评论0 收藏0
  • 什么是最适合云数据库的架构设计?

    摘要:在技术探索中,选择了更适合云数据库场景的架构和引擎设计。目前,巨杉数据库付费企业级客户与社区用户总数超过家,并已在超过家强级别的银行保险证券等大型金融机构核心生产业务上线。这一整体架构设计相信是云数据发展的主流架构设计。 分布式数据库技术发展多年,但是在应用、业务的驱动下,分布式数据库的架构一直在不断发展和演进。 开源金融级分布式数据库SequoiaDB,经过6年的研发,坚持从零开始打...

    JiaXinYi 评论0 收藏0

发表评论

0条评论

Lycheeee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<