InnoDB的In-Memory Structures

一.Mysql架构

mysql示意图.jpg
  • 我们在终端上调用的 mysql 就是一个 MySQL Client Program, 是一个命令行程序,可以连接 MySQL Sever,执行一些SQL语句. 还有mysqlcheck、mysqldunm等,都是mysql官方提供的. 此外还有Go语言 sql标准库提供的连接函数可以连接到 Mysql Sever

  • 主要做事情的就是Mysql Sever. 在系统中是一个叫mysqld的守护进程(daemon),一般是开机自启

  • 数据库本质上是一些文件的集合,用来储存数据的. 我们一般讲的数据库是 数据库实例, 是用来操作数据库文件的. MySQL数据库实例在系统上表现的就是一个进程,就是mysqld.

terminal.jpg

1.MySQL Sever 做绝大多数工作,下面是其体系结构图

mysql架构.jpg
  • MySQL的储存引擎是插件式的,是基于表而不是数据库. 因此同一个数据库中可以有使用不同存储引擎的表

  • 存储引擎常用的一般就是InnoDB了

2.InnoDB存储引擎体系架构

InnoDB架构.jpg
  • 后台线程有 Master Thread, IO Thread, Purge Thread 等, 就是做各种事情的,比如将缓冲池的数据刷新到磁盘,处理IO请求.

  • InnoDB存储引擎是基于磁盘储存的(话说Redis是基于内存存储的?). 由于CPU速度和磁盘速度的巨大差异, InnoDB采用缓冲池技术来提高数据库整体性能

3.InnoDB的逻辑储存结构

储存结构.jpg
  • page 的大小默认是16KB.

二.缓冲池(Buffer pool)

1.缓冲池结构

  • 在缓冲池中是对页(Page)进行操作,页是InnoDB磁盘管理的最小单位

  • 一般查询时, 先进行读取页的操作,把磁盘中读到的页放在缓冲池中. 下次再次读取到相同的页时先判断该页是否在缓冲池中,如果在,就直接从缓冲池中读取,称为该页在缓冲池中被命中(hit), 否则,就从磁盘读取.

  • 对页的修改操作,也是先修改缓冲池中的页,然后再以一定的频率刷新到磁盘上(这个就是Master Thread 做的事情了).

  • 可以想象, 缓冲池的容量越大,能缓冲的页就越多,对数据库的读写速度越快,数据库性能越优良. 一般在专用服务器上,缓冲池大小能占内存的80%.

接下来上图

内存数据对象.jpg

这个图过时了,MySQL5.6的版本(最新是8.0), 这图意思意思就行

  • 缓冲池中的数据页和索引页占很大一部分. 数据页就是储存我们的Record.

  • 图中的那个结构就叫一个缓冲池实例, InnoDB允许有多个缓冲池实例,来缓解并发操作时的资源竞争问题, 从磁盘中读取的页会通过哈希算法平均分配到不同的缓冲池实例中.(这个和缓冲池大小一样都是可以进行设置的)

2. LRU List

  • 缓冲池被分为一张张的页(Page)来管理数据. 你可以想像成是一张张连续页组成的列表(Page List). 这些页通过LRU(Latest Recently Used)算法来管理.

下面上图

Content is described in the surrounding text.
  • Old Sublist中的页叫 Old Page, 它被读取后会被移动到New Sublist 的头部,这个过程叫(make young)

  • New Sublist 中的页叫 New Page, 未被读取的话会往下移动

  • 翻译出来怪怪的,直接贴原文

  • As the database operates, pages in the buffer pool that are not accessed “age” by moving toward the tail of the list. Pages in both the new and old sublists age as other pages are made new. Pages in the old sublist also age as pages are inserted at the midpoint. Eventually, a page that remains unused reaches the tail of the old sublist and is evicted(被刷出LRU列表).

  • 为什么最新读进缓冲池的数据不是直接插在New Sublist的顶部? 因为5/8的数据是热点数据,就是最近或者经常被读取的, 但是SQL的一些扫描操作

    需要访问表中的大部分页甚至是全部,就会把之前经常访问的一些热点数据给刷掉,所以从5/8的那个部分插入.

  • LRU列表管理的是已经被读取的页. 但是数据库刚启动的时候,LRU列表是空的. 这时缓冲池所有的页都放在Free列表中. 当需要从缓冲池中申请页时,先从Free列表中查找是否有空闲的页,有就将该页从Free列表中删除,放到LRU列表中.否则就要淘汰LRU列表末尾的页了.

通过SHOW ENGINE INNODB STATUS 命令可以查看相关的参数

SHOW ENGINE.jpg
  • 前两个单位是byte, 后面是页,页的默认大小是16KB.

  • Database pages 就是LRU列表的Page数

  • 对数据的修改也是先缓冲到缓冲池的,被修改过的页叫脏页(Dirty Page), 就是Modified db pages. 通过Checkpoint机制将脏页刷新回磁盘.

  • young/s 是只Old Pages 平均每秒被读取的总次数, 如果这个值太低的话,可能是Old Sublist 设置的太小了,要把它增大点

  • Buffer pool hit rate 就是之前讲的命中率, 命中率越高说明数据库性能越好

3.Change Buffer

innodb-change-buffer.png
  • clustered index(聚合索引),在InnoDB中也叫主键索引(primary key), 就是我们建表的时候指定主键的那个列,其值是唯一的.我们每张表都要有一个主键,表中数据的存储顺序是根据主键的值来的,为了加速涉及到主键的查询.

  • 在用 Where 子句时,如果有对索引列的引用,查询就很快. 但是很多时候我们查询(Insert,Update也要用到查询)不需要用到主键,我们会对其他列建立索引. 其他列不保证数据的唯一性, 这种索引就是叫secondary index(辅助索引) .

  • 前面我们知道缓冲池有数据页还有索引页等. Change Buffer 就是缓冲 涉及对辅助索引页的 INSERT, UPDATE, OR DELETE 操作.

  • 辅助索引的值不是唯一的也比较离散,对辅助的索引和删除操作会影响到索引树中其他的索引页,(就比如对一张页的修改可能会牵扯到好几张页,都读入缓冲池的话磁盘I/O开销较大,) 所以设计思路是:

    对索引页的修改,先看要被修改页是不是在缓冲池中,如果在就直接写进缓冲池中的索引页,如果不在,就缓冲在Change Buffer中. 当要被修改的索引页被读进缓冲池后,再将Change Buffer中的修改合并到缓冲池中.

shot1.jpg

SHOW ENGINE INNODB STATUS; 可以查看Change Buffer 状态

我自己测不出变化,数据量少的时候,数据库所有的数据都会被缓冲到缓冲池,change buffer 不起作用.

部分图片来源:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342