小伙伴们,新的系列文章已经开启啦!没错,就是Mysql!作为使用最多的关系型数据库,不光要知道怎么使用,还要知道它的底层工作原理!因此,这个系列,我不会讲太多关于Mysql应用级别的知识,我更关注它的技术内幕!

本文目录
Mysql体系架构
浅谈Mysql存储引擎
什么是OLTP与OLAP?
初识InnoDB存储引擎
InnoDB的特点
InnoDB各版本功能对比
InnoDB体系架构
InnoDB内存池
Mysql体系架构
数据库(database)和实例(instance)的区别?
数据库是物理操作系统或其它形式文件类型的集合。比如在Mysql中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件;
实例由后台线程及一个共享内存区组成;
数据库与实例是一对多的关系;
图1.Mysql体系架构图
Mysql Server组成部分:
连接池组件
管理服务和工具组件
SQL接口组件
查询分析器组件
优化器组件
缓冲(Cache)组件
插件式存储引擎
物理文件
浅谈Mysql存储引擎
如何编写自定义存储引擎?
实现Mysql预定义的存储引擎接口,可以编写自定义的存储引擎。
由于Mysql是开源的,因此存储引擎可以分下面两大类:
Mysql官方存储引擎
第三方存储引擎,如InnoDB(后被Oracle收购),是Mysql OLTP应用中使用最广泛的存储引擎
show engines\G可查看当前Mysql支持的存储引擎。
下面介绍两种最常用的存储引擎:
InnoDB:支持事务,面向OLTP应用,特点:行锁设计、支持外键、非锁定读;
MyISAM:不支持事务、表锁,支持全文索引,主要面向OLAP应用;
图2展示了各存储引擎之间的比较。
图2.各存储引擎比较
当表的数据大于1000万时Mysql的性能会急剧下降吗?
Mysql是数据库,不是文件系统,数据行数的增加使性能有所下降是必然的,但是这些下降不是线性的,如果用户选择了正确的存储引擎以及正确的配置,再多的数据量Mysql也能承受;
什么是OLTP与OLAP?
在线事务处理OLTP(online transaction processing):是传统的关系型数据库的主要应用,主要面向基本的、日常的事务处理,例如银行交易;
在线分析处理OLAP(On-Line Analytical Processing):是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果;
OLTP | OLAP | |
用户 | 操作人员、低层管理人员 | 决策人员、高级管理人员 |
功能 | 日常操作处理 | 分析决策 |
DB设计 | 面向应用 | 面向主题 |
数据 | 当前的、最新的细节的、二维的分立的 | 历史的、聚集的、多维的集成的、统一的 |
存取 | 读写数十条记录 | 读上百万条记录 |
工作单位 | 简单的事务 | 复杂的查询 |
用户数 | 上千个 | 上百万个 |
DB大小 | 100MB-GB | 100GB-TB |
时间要求 | 具有实时性 | 对时间的要求不严格 |
主要应用 | 数据库 | 数据仓库 |
初识InnoDB存储引擎
InnoDB的特点
支持事务,面向OLTP应用,行锁设计,支持外键、非锁定读;
InnoDB存储引擎将数据放在一个逻辑表空间,这个表空间就像黑盒一样由InnoDB自身进行管理,并且它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;
InnoDB支持用裸设备建立表空间;
InnoDB使用多版本并发控制(MVCC)来获得高并发性。并且实现了SQL标准的4种隔离级别,默认为repeatable。同时,使用一种被称为next-key locking的策略来避免幻读现象的产生;
除此之外,InnoDB还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能;
对于表中数据的存储,InnoDB采用了聚集方式,因此每张表的数据都是按主键顺序存放。如果没有显式指定,则InnoDB会为每一行数据生成一个6字节的ROWID;
InnoDB是事务安全的Mysql存储引擎;
版本 | 功能 |
老版本InnoDB | 支持ACID、行锁设计、MVCC |
InnoDB 1.0.x | 继承上版本所有功能,增加了compress和dynamic页格式 |
InnoDB 1.1.x | 继承上版本所有功能,增加了Linux AIO、多回滚段 |
InnoDB 1.2.x | 继承上版本所有功能,增加了全文索引支持、在线索引添加 |

维护所有进程/线程需要访问的多个内部数据结构;
缓存磁盘上的数据,方便快速地读取,同时在磁盘文件的数据修改之前在这里缓存;
重做日志(redo log)缓冲;
其它;
负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据;
将已修改的数据文件刷新到磁盘文件;
保证数据库发生异常的情况下InnoDB能恢复到正常运行状态;
Master Thread:负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性;
IOThread:InnoDB中大量使用了AIO,IOThread负责这些IO请求的回调;
Purge Thread:事务提交后,undolog可能不再需要,因此需要Purge Thread来回收已经分配并使用的undo页;
Page Cleaner Thread:1.2.x版本中引入,作用是将Master Thread中脏页的刷新操作放到单独的线程中进行,减轻Master Thread的负担及对用户查询线程的阻塞,进一步提高InnoDB性能;

由于InnoDB是基于磁盘存储的,而CPU与磁盘的速度差异较大,因此需要基于内存的缓冲技术来提高速度;
从1.0.x版本开始缓冲池允许有多个实例,磁盘上的数据根据以页为单位通过哈希值平均分配到不同的缓冲池实例,这样做的好处是减少数据库内部的资源竞争、增加数据库并发处理能力;
而缓冲池通过LRU算法进行管理,InnoDB维护了一个LRU List,最频繁使用的页放在头部,最少使用的页放在尾部,当缓冲池不能存储新读取到的页时,会释放掉尾部的页;