mysql引擎结构_Mysql体系结构和存储引擎

MySQL体系结构和存储引擎定义数据库和实例

0abcc959bdcab88b9724528cd44b8fa2.png

在Linux操作系统中通过以下命令启动MySQL数据库实例,并通过命令ps观察MySQL数据库启动后进程:

3f7d7712b9bb013bbce884e63a22c6b3.png

MySQL数据库会去读取配置文件,如果几个配置文件都有同一参数,MySQL数据库以独到最后一个配置文件中的参数为准。

dc877166abaedebd1d66e49867ff535a.png

配置文件中有一个参数datadir,该参数指定了数据库所在的路径。在Linux操作系统下默认datadir为/usr/local/mysql/data,用户可以修改该参数,也可以使用该路径,不过改路径只是一个链接。

61b6c1f1f54339194df9bda5dc973fba.png

76e65d1e6f79a91b20468208d8da1946.png

从上面可以看出,data只是一个软连接,该链接指向了/opt/mysql_data目录,当然,用户必须保证/opt/mysql_data的用户和权限,使得只有mysql用户和组可以访问(MySQL数据库的权限为mysql:mysql)MySQL体系结构

73aa5c9ab12421b1971505f8d343bb22.png

MySQL由以下几部分组成,连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插入式存储引擎、无力文件

bb085d661408dbbcd8e83e55422c12e3.png

MySQL区别于其它存储引擎,存储引擎是基于表的,而不是数据库。存储引擎

存储引擎的特性:

c08f6870de68fa0c24219dfdf484cab7.png

查看存储引擎:

04008435451902c734ac5e977ff4e8ea.png

创建数据引擎的TABLE:CREATE TABLE mytest ENGINE=MYISAM

存储引擎的选择会影响到表的大小连接MySQL

连接Mysql操作是一个连接进程和MySQL数据库实例进行通信。

TCP/IP

65e1cf34adb40351dd85506fceac2082.pngmysql -h192.168.0.101 -u david -p

use mysql;

select host,user from User;

798e5d020c69ced7003a3bd94ec32f78.png

InnoDB存储引擎InnoDB体系架构

6ce8ed940dcbd1edcf95d2c1bebd2cd5.png

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

后台线程

1.Master Thread

Master Thread负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo页的回收等。

2.IO Thread

536c2b5c47d6f02eb092fdc04e1301c7.png

f601f1f446fd67f5fc20a325d8955c24.png

13e5aad058f607a7123a75d26014f2de.png

通过SHOW ENGINE INNODB STATUSG;

命令来观察InnoDB中的IO Thread:

dcf20b3639bb5534ad9262ad1752f541.png

376901e05edea126144f7a22a2fed4ad.png

3.Purge ThreadSHOW VARIABLES LIKE 'innodb_purge_threads'G;

d621f007249ae0709981042b945e22a2.png

4.Page Cleaner Thread

作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。其目的是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

内存缓冲池

通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。

49cc4ed29c32e8458c9468f83798cfb2.png

3fd5bc155dcb586a65e5c3b2527079f7.png

981b87c68b3dd34f2a936c7e4b49d196.png

缓冲池个数:

4e577da24592ffd8dc807ef0a1cc360b.pngshow engine innodb statusG;

03e02b44ae486cb4321b878e47455d7a.pngLRU List、Free List 和 Flush List

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

在InnoDB存储引擎中,缓冲池中页的默认大小为16KB, 同样使用LRU算法对缓冲池进行管理。稍有不同的是InnoDB存储引擎对传统的LRU算法做了一些优化。在InnoDB的存储引擎中,LRU列表中还加入了midpoint位置。

新读取到的页,并不是直接放入LRU列表首部,二是midpoint位置。

b7e79a6b2e8641962616e64c90cedf5c.png

c5ff526b57cd9e38d83310b9cde4a065.pngset global innodb_old_blocks_time=1000;

9ace71543702c2113db72d686a282bee.png

b34a9b20553ef071b00d4bd8ce4e8090.png

通过表INNODB_BUFFER_POOL_STATS来观察缓冲池的运行状态。

f113cf6751e2f7a8a0e363485acb838c.png

此外,还可以通过表INNODB_BUFFER_PAGE_LRU来观察每个LRU列表中每个页的具体信息,例如通过下面的语句可以看到缓冲池LRU列表中SPACE为1的表的页类型。

8498ea567771bf29024d5a1761f1dbf2.png

InnoDB存储引擎将原本16KB的页压缩为1KB、2KB、4KB和8KB。而由于页的大小发生了变化,LRU列表也发生了些许改变。对于非16KB的页,是通过unzip_LRU列表进行管理的。

669a9cabf5f32c5171a9dbd5c5734cad.png

6dc5cdb6bf3fa53b0fe3df6109199b56.png

366421dfd2fd26f2936836d7cdf68d9e.png重做日志缓存

1341157d5ae78d0c27f1039bce473e09.png

aea734c6067e2f0875a90eecadab00a6.png额外的内存池

269998f9fa1ac1c01747ae445cda2a53.png

Chectpoint技术

579fcd78a7664e9f9eaa03f4a5ad8871.png

局限性:

日志不可能无限地增大(成本要求太高),同时缓冲池也无限的增大,能够缓冲足够的数据。就算满足以上两个条件,宕机后数据库恢复时间,数据库运行几个月甚至几年,重做日志会花费非常久的时间。

此时CheckPoint(检查点)技术的目的是解决一下几个问题:缩短数据库恢复的时间

缓冲池不够用时,将脏页刷新到磁盘

重做日志不可用时,刷新脏页

16eabf88e3cd98aed10fad42c8e2f72c.png

几个关键的名词:

缓冲池的作用是等待和存储用户输入的操作命令

缓冲池基于的LRU算法,即将旧页放在列表后面,将新页放在列表前面。

但是由于一些sql操作比如索引,会将热点数据刷出,设计了midpoint点,midpoint表前面部分成为new表,后面部分称为old表

在缓冲池的LRU被修改后,这时磁盘和缓冲池的数据不一致,产生脏读,数据库就会通过CheckPoint机制将脏页刷新到磁盘。由于页的操作都是现在缓冲池中进行的,会有以下几个问题:1.缓冲池不是无限大2.在数据从页的新版本刷新到磁盘的过程中可能会遇到宕机,为了避免数据丢失,就采取日志记录,但是日志也不是无限大。(Write ahead Log策略)

Checkpoint技术就解决了数据从缓冲池到磁盘更新问题。

90e484c6894fc3115ef8b03723d0cac3.png

1f1e82f64d7773663f8ee5d982f84409.png

Sharp CheckPoint发生在数据库关闭时将所有的脏页都刷新回到磁盘,这时默认的工作方式innodb_fast_shutdown=1。

但是若数据库在运行时也使用Sharp CheckPoint, 那么数据库的可用性就会收到很大影响。故在InnoDB存储引擎内部使用Fuzzy CheckPoint进行页刷新,即只刷新一部分脏页,而不是刷新所有的脏页回磁盘。

在Innodb存储引擎中可能发生如下几种情况的Fuzzy Checkpoint:

Master Thread CheckPoint和FLUSH_LRU_LIST CheckPoint:

244d783a308eb8e50f1a10695e112d5e.png

980ae47bc2e3465a4ad52d4ee0be25e1.png

Async/Sync Flush CheckPoint:

2e256154923484c1fac3c892d0eaf579.png

Dirty Page too much CheckPoint:

1a84a70740657c33f8aceecd9906f54b.png

a39a5649525ed1f567672bd0f1eab58c.png

Master Thread工作方式

InnoDB存储引擎主要工作都是在一个单独的后台线程Master Thread中完成,

Master Thread具有最高的线程优先级别,其内部由多个循环(loop)组成,主循环(main loop) 后台循环(backgroup loop)、刷新循环(flush loop)、暂停循环(suspend loop)。

Master Thread会根据数据库运行的状态在loop, backgroup loop, flush loop, 和suspend loop中进行切换。

41110a1ca0adff95ac5532b7a26d31b6.png

b4546bca717e39d53a50144ec2841876.png

c704cbf7a40245ab3930addf321f0e55.png

InnoDB关键特性插入缓冲(Insert Buffer)

Insert Buffer是物理页的一个组成部分。

24ec097dcb7cf5f430fc366c9cb9f3e7.png两次写(Double Write)

f7fa0f900d6f36b57e187fb690a55982.png

7648e552ea0ba48de1610e297287af49.png自适应哈希索引(Adaptive Hash Index)

哈希(hash)是一种非常快的查找方法,查找时间复杂度为O(1), 即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度。异步IO(Async IO)

为了提高磁盘操作性能,当前的数据库系统都采用异步IO的方式来处理磁盘操作。InnoDB存储引擎亦是如此。刷新领接页(Flush Neighbor Page)

当一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起刷新。

启动、关闭与恢复关闭

29cea7a4bacfe7448be07c8b2ee2ec02.png恢复

88bf6d7cd19c89ad9ef1f281efa12dbd.png

在设置了参数innodb_force_recovery 大于0后,用户可以对表进行select、create和drop操作,但insert、update和delete这类DML操作不允许。

4e447e1bf3c016982565a4dc8e941539.png

4811d32a769674838e7df43e2f9b5976.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值