《MySQL技术内幕-InnoDB存储引擎》阅读小记(一)

2018/09/05

[TOC]

MySQL体系结构

InnoDB存储引擎

概述

体系架构

后台线程

内存

缓冲池

innodb是基础磁盘存储的,将记录按照页的方式进行管理,是基础磁盘的数据库系统(disk-base database)

所以用缓冲池技术提高数据库的整体性能

所以缓冲池的大小影响数据库的整体性能

innodb内存数据对象

从1.0.x开始,可以有多个缓冲池实例,每个页根据哈希值平均分配到不同的缓冲池实例,可以通过innodb_buffer_pool_instances设置,默认为1

LRU list / Free list / Flush list

缓冲池通过LRU(lastest recent used , 最近最少使用)算法进行管理:最先释放最不经常使用的数据

innodb对lru算法进行了一个优化:将新数据不放在首部,而是中间部位midpoint位置:扫描的时候读了一次数据就再也不用了,避免热点数据排除lru list。

这个算法叫做midpoint insertion strategy,midpoint位置由参数innodb_old_blocks_pct控制,默认是lru list的5/8处。

midpoint之后的list叫做old list,之前的list叫做new list。

Checkpoint技术

做的什么事情

解决下面几个问题

innodb存储引擎使用LSN(log sequence number)标记版本,是一个8字节的数字,单位是字节。

每个页有LSN,重做日志也有LSN,checkpoint也有LSN

checkpoint发生的时间、条件、脏页的选择等都非常复杂

innodb内部有两种checkpoint

master thread工作方式

主要工作都是在这里完成的

innodb 1.0.x之间版本的master thread

Master thread内部有多个循环loop组成:

主循环 loop

在主循环里面会有一个每秒进行的操作和一个每10秒进行的操作

每秒进行的操作:

每10秒进行的操作:

Backgroup loop

如果没有用户活动或者数据库关闭(shutdown)就会切换到这个线程

执行以下操作:

Innodb 1.2.x之前版本的master thread

刷新数量不再硬编码,而是使用百分比控制

当使用ssd之类的时候,就可以调高 innodb_io_capacity,知道符合磁盘IO的吞吐量

将 innodb_max_dirty_pages_pct 从 90 调整到 80

innodb 1.2.x版本的master thread

innodb的关键特性

包括

缓冲插入 insert buffer

带给innodb的是性能的提升

1. insert buffer

缓冲池里面有insert buffer,物理页里面也有

在innodb中,主键是唯一的标识符。插入的时候会寻找到主键的位置,然后插入。

所以如果主键是逐渐递增的,那么就是磁盘的顺序IO,速度很快。

但是在一个表不会只有一个主键,可能还有其他索引,那么在B+树的叶子节点上,就要寻找到第二个索引所在的位置进行插入,也就是随机IO。

为了优化这种随机IO,创建了insert buffer:先判断插入的索引页是不是在缓冲池,如果是,就插入到缓冲池;如果不是,就先放到一个insert buffer中。然后再以一定的频率和情况将insert buffer和所以也子节点merge。这个时候通常能够将多个插入合并到一个操作里面(因为在一个索引页),大大提高了非聚集索引插入的性能。

insert buffer的使用需要同时满足以下两个条件:

insert buffer的问题

2. change buffer

1.0.x引入了change buffer,可视为insert buffer的升级,可以对dml操作都进行缓冲,分别是:

同样有非唯一的限制

对一个记录进行update操作有两个过程

提供innodb_change_buffering参数,用来控制开启哪种buffer

3. Insert buffer的内部实现

insert buffer是一个全局的放在共享空间的B+树

???

4. merge isnert buffer

什么时候将insert buffer的数据merge到辅助索引页

两次写 double write

带给innodb的是数据页的可靠性

假如写输入到一个页中,写到一半,发生宕机(部分写失效 partial page write),导致页损坏,那么可能会导致数据丢失。这个是不能通过重做日志恢复,因为页本身已经损坏,重做日志(对页的物理操作)没有意义。

需要先通过页的副本还原该页,再使用重做日志,这个叫做doublewrite。

??????

自适应哈希索引 adaptive hash index

哈希:一次就可以定位数据

B+树:取决于树的高度,生产环境一般是3-4层,所以需要查询3-4次

AHI(adaptive hash index):观察到一个访问模式访问频繁,就会建立哈希索引

异步IO async io

刷新邻接页 flush neighbor page

刷新一个脏页的时候,检测这个页所在的区(extent)的所有页,如果是脏页,就一起刷新。

所以可以利用AIO将多个io合并为一个io

问题