MySQL学习笔记之InnoDB引擎概述

该笔记为《MySQL技术内幕:InnoDB存储引擎》的读书笔记,多图预警。

MySQL体系结构

MySQL体系结构

连接层

(管理客户端的连接,维护线程池)

最上层是一些客户端和连接服务,引入了线程池的概念;实现基于 SSL 的安全连接。

每个客户端都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。

当客户端连接到 MySQL 服务器时,服务器需要对其进行认证。如果使用了 SSL 安全套接字的方式连接,还会使用 X.509 证书认证。一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限。

服务器

(与具体存储引擎解耦,服务器通过 API 与存储引擎进行通信)
+ SQL 接口
+ SQL 分析与优化
+ 存储过程
+ 触发器
+ 视图

MySQL 会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。

优化器并不关心表使用的是什么存储引擎,但存储引擎对优化查询是有影响的。优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。

对于 SELECT 语句,在解析查询前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不再执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。

存储引擎层

(负责数据的存储和存取)

存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取。

存储引擎 API 包含了几十个底层函数,用于执行诸如“开启一个事务”或者“根据主键提取一行记录”等操作。但存储引擎不会去解析 SQL(InnoDB 是一个例外,它会解析外键定义,因为服务器没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

存储层

(将数据存储到文件系统上)

数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

InnoDB引擎与MyISAM引擎介绍

InnoDB

MySQL学习笔记之InnoDB引擎概述
  • 支持事务
  • 行锁设计
  • 支持外键
  • 使用MVCC
  • 面向OLTP

MyISAM

MySQL学习笔记之InnoDB引擎概述

InnoDB引擎介绍

概述

MySQL学习笔记之InnoDB引擎概述

InnoDB体系架构

MySQL学习笔记之InnoDB引擎概述

后台线程

MySQL学习笔记之InnoDB引擎概述

MySQL学习笔记之InnoDB引擎概述

innodb_purge_threads

内存

MySQL学习笔记之InnoDB引擎概述

innodb_buffer_pool_size

MySQL学习笔记之InnoDB引擎概述

innodb_buffer_pool_instances

MySQL学习笔记之InnoDB引擎概述

innodb_old_blocks_pct

innodb_old_blocks_time

MySQL学习笔记之InnoDB引擎概述

innodb_log_buffer_size

CheckPoint技术

CheckPoint技术即检查点技术,我在数据库理论之事务与恢复技术中有提及。不过当时对检查点相关的阐述是记录了提交的事务,然而InnoDB并不会立即写回磁盘,所以这里谈的是脏页的刷新。

MySQL学习笔记之InnoDB引擎概述

InnoDB逻辑存储结构

InnoDB的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成。

MySQL学习笔记之InnoDB引擎概述

表空间

默认情况下InnoDB存储引擎有一个共享表空间ibdata1,所有的数据都存放在这个表空间内。如果用户启用了参数innodb_file_per_table,则每张表的数据可以单独放到一个表空间内,对应一个ibd文件,称为独立表空间,它存放的只是数据、索引和插入缓冲 bitmap 页,其他数据,如回滚信息、插入缓冲索引页、系统事务信息、二次写缓冲等还是存放在原来的共享表空间中。

段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在InnoDB存储引擎中,对段的管理都是由引擎自身所完成的。

数据段即为B+树的叶子节点,索引段即为B+树的非索引节点。

  
区就是上图的extent区域,区是由连续的页组成的空间,无论页的大小怎么变,区的大小默认总是为1MB。为了保证区中的页的连续性,InnoDB存储引擎一次从磁盘申请4-5个区,InnoDB页的大小默认为16kb,即一个区一共有64(1MB/16kb=16)个连续的页。每个段开始,先用32页(page)大小的碎片页来存放数据,在使用完这些页之后才是64个连续页的申请。这样做的目的是,对于一些小表或者是undo类的段,可以开始申请较小的空间,节约磁盘开销。

页在一些文档里也被称为块。

页就是上图的page区域,也可以叫块。页是InnoDB磁盘管理的最小单位。默认大小为16KB,可以通过参数innodb_page_size来设置。常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页,未压缩的二进制大对象页,压缩的二进制大对象页等。  

每个页允许存放 16KB/2 – 200 行的记录,即 7992 行记录。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/mysql%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b9%8binnodb%e5%bc%95%e6%93%8e%e6%a6%82%e8%bf%b0/