暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

不可不知的Mysql技术原理!

波波的小书房 2021-04-21
303


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


智者务其实,愚者争其名


本文目录

Mysql体系架构

浅谈Mysql存储引擎

什么是OLTP与OLAP?

初识InnoDB存储引擎

  • InnoDB的特点

  • InnoDB各版本功能对比

  • InnoDB体系架构

  • InnoDB内存池


文章中有很多专业术语可能只是提到了一下,并没有做深入解释,如果大家不明白的话,先了解一下即可,后期的文章我会慢慢介绍这些概念。


Mysql体系架构


数据库(database)和实例(instance)的区别?

  • 数据库是物理操作系统或其它形式文件类型的集合。比如在Mysql中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件;

  • 实例由后台线程及一个共享内存区组成

  • 数据库与实例是一对多的关系;


另外,Mysql是单进程多线程。

图1展示了Mysql Server体系架构中的所有组件。Mysql Server基于文件系统,而Mysql Server插件式的存储引擎是相较于其它数据库的一大特色。

图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之间的比较。

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各版本功能对比

版本
功能
老版本InnoDB
支持ACID、行锁设计、MVCC
InnoDB 1.0.x
继承上版本所有功能,增加了compress和dynamic页格式
InnoDB 1.1.x继承上版本所有功能,增加了Linux AIO、多回滚段
InnoDB 1.2.x继承上版本所有功能,增加了全文索引支持、在线索引添加


InnoDB体系架构


内存池的作用:
  • 维护所有进程/线程需要访问的多个内部数据结构;

  • 缓存磁盘上的数据,方便快速地读取,同时在磁盘文件的数据修改之前在这里缓存;

  • 重做日志(redo log)缓冲;

  • 其它;


后台线程的作用:
  • 负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据;

  • 将已修改的数据文件刷新到磁盘文件;

  • 保证数据库发生异常的情况下InnoDB能恢复到正常运行状态;


InnoDB的后台线程:
  • Master Thread:负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性;

  • IOThreadInnoDB中大量使用了AIO,IOThread负责这些IO请求的回调;

  • Purge Thread事务提交后,undolog可能不再需要,因此需要Purge Thread来回收已经分配并使用的undo页;

  • Page Cleaner Thread1.2.x版本中引入,作用是将Master Thread中脏页的刷新操作放到单独的线程中进行,减轻Master Thread的负担及对用户查询线程的阻塞,进一步提高InnoDB性能;



InnoDB内存池

图3.InnoDB内存池

如上图所示,InnoDB内存池由多个内存块组成,下面主要介绍一下缓冲池:
  • 由于InnoDB是基于磁盘存储的,而CPU与磁盘的速度差异较大,因此需要基于内存的缓冲技术来提高速度

  • 从1.0.x版本开始缓冲池允许有多个实例,磁盘上的数据根据以页为单位通过哈希值平均分配到不同的缓冲池实例,这样做的好处是减少数据库内部的资源竞争、增加数据库并发处理能力;

  • 缓冲池通过LRU算法进行管理,InnoDB维护了一个LRU List,最频繁使用的页放在头部,最少使用的页放在尾部,当缓冲池不能存储新读取到的页时,会释放掉尾部的页;


文章转载自波波的小书房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论