关于c++:让你搞懂MYSQL底层原理-内部结构

一、一条SQL执行过程

先看看一条查问SQL

(这里提供一下官网对各存储引擎的文档阐明 Mysql存储引擎)

一条 update SQL执行
update的执行 从客户端 => ··· => 执行引擎 是一样的流程,都要先查到这条数据,而后再去更新。要想了解 UPDATE 流程咱们先来看看,Innodb的架构模型。
Innodb 架构
上一张 MYSQL 官网InnoDB架构图:

外部模块
连接器(JDBC、ODBC等) =>

[MYSQL 外部

[Connection Pool] (受权、线程复用、连贯限度、内存检测等)
=>

[SQL Interface] (DML、DDL、Views等) [Parser] (Query Translation、Object privilege) [Optimizer] (Access Paths、 统计分析) [Caches & Buffers]
=>
[Pluggable Storage Engines] 

=> [File]

二、内存构造

这里有个关键点,当咱们去查问数据时候会先 拿着咱们以后查问的 page 去 buffer pool 中查问 以后page是否在缓冲池中。如果在,则间接获取。

而如果是update操作时,则会间接批改 Buffer中的值。这个时候,buffer pool中的数据就和咱们磁盘中理论存储的数据不统一了,称为脏页。每隔一段时间,Innodb存储引擎就会把脏页数据刷入磁盘。一般来说当更新一条数据,咱们须要将数据给读取到buffer中批改,而后写回磁盘,实现一次 落盘IO 操作。

为了进步update的操作性能,Mysql在内存中做了优化,能够看到,在架构图的缓冲池中有一块区域叫做:change buffer。顾名思义,给change后的数据,做buffer的,当更新一个没有 unique index 的数据时,间接将批改的数据放到 change buffer,而后通过 merge 操作实现更新,从而缩小了那一次 落盘的IO 操作。

  • 咱们下面说的有个条件:没有惟一索引的数据更新时,为什么必须要没有惟一索引的数据更新时能力间接放入changebuffer呢?如果是有惟一束缚的字段,咱们在更新数据后,可能更新的数据和曾经存在的数据有反复,所以只能从磁盘中把所有数据读出来比对能力确定唯一性。
  • 所以当咱们的数据是 写多读少 的时候,就能够通过 减少 innodb_change_buffer_max_size 来调整 change
    buffer在buffer pool 中所占的比例,默认25(即:25%)

问题又来了,merge是如何运作的
有四种状况:

  • 有其余拜访,拜访到了当前页的数据,就会合并到磁盘
  • 后盾线程定时merge
  • 零碎失常shut down之前,merge一次
  • redo log写满的时候,merge到磁盘

    学习材料视频收费获取,学习直通车。

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据