mysql技术内幕 innodb存储引擎 第2版_《MySQL技术内幕 InnoDB存储引擎 第2版》学习笔记...

本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那就点个小心心,文末赞赏一杯豆奶吧,嘻嘻。 让我们共同成长吧……

第1章  MySQL体系结构和存储引擎

1.1  定义数据库和实例

数据库:物理操作系统文件或其他形式文件类型集合。mysql中数据库文件可以是frm、MYD、MYI、ibd结尾的文件。

实例:mysql数据库由后台线程以及一个共享内存区组成。数据库实例才是正真操作数据库文件的。

MySQL是一个单进程多线程架构的数据库。MYSQL数据库实例在系统上的表现是一个进程。

1.2  MySQL体系结构

从概念上讲,数据库是文件的集合,是按照某种数据模型组织起来并存放在二级存储器中的数据集合;数据库实例是程序,用户通过数据库实例与数据库打交道。

MySQL体系结构:连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件。

注意:存储引擎是基于表的,不是基于数据库的

1.3  MySQL存储引擎

1.3.1  InnoDB存储引擎

InnoDB存储引擎支持事务、支持行级锁、支持外键、支持非锁定读、MySQL5.5.8之后的默认存储引擎、支持MVCC获取高并发性、实现了SQL的4中隔离级别(默认repeatable)、使用next-key locking策略避免幻读产生、提供了插入缓冲、二次写、自适应哈希索引、预读、采用聚集方式存储数据。

1.3.2  MyISAM存储引擎

MyISAM不支持事务、支持表级锁、支持全文索引、面向OLAP数据库应用、缓冲池中指存储索引文件,不缓冲数据文件,MyISAM存储引擎表由MYD和MYI组成。

1.3.3  其他储存引擎

NDB(集群存储引擎)、Memory(默认使用哈希索引)、Archive、Federated、Maria等。

1.4  各存储引擎之间的比较

1.5  连接MySQL

连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。本质上是进程通信。进程通信方式:管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。

第2章  InnoDB存储引擎

InnoDB是事务安全型MySQL存储引擎,是OLTP应用首选的存储引擎。

2.1  InnoDB存储引擎概述

2.2  InnoDB存储引擎的版本

2.3  InnoDB体系架构

InnoDB存储引擎体系架构由:后台线程、内存池、和数据库文件组成。

内存池:维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便读取;重做日志缓冲……

后台线程:负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据;将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行的状态下。

2.3.1  后台线程

InnoBD是多线程模型,后台的不同线程负责处理不同任务。

1、Master Thread

主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲、undo页的回收等。

2、IO Thread

InnoDB使用了大量的AIO处理写IO请求,极大提高了数据库性能,IO Thread主要负责这些IO请求的回调处理。

3、Purge Thread

负责回收已经使用并分配的undo页。

4、Page Cleaner Thread

将脏页刷新操作放在单独的线程中执行。目的是为了减轻Master Thread的工作以及对于用户查询线程的阻塞。

2.3.2  内存

1、缓冲池

InnoDB是基于磁盘存储的,将其中的记录按照页的方式进行管理。缓冲池用来弥补磁盘速度相对于内存慢对数据库性能的影响。

缓冲池中缓存的数据页:索引页、数据页、undo页、插入缓冲、自适应哈希索引、InnoDB存储的锁信息、数据字典信息等。

InnoDB内存数据对象:缓冲池(索引页、数据页、插入缓冲、自适应哈希索引、InnoDB存储的锁信息、数据字典信息等)、重做日志缓冲、额外内存池。

允许有多个缓冲池实例,每个页根据哈希值分配平均分配到不同缓冲池实例中,这样做减少了数据库内部的资源竞争,增加数据库并发处理能力。

2、LRU List、Free List和Flush List

数据库中的缓冲池是通过LRU算法进行管理的。InnoDB缓冲池中的页默认16KB。InnoDB对LRU进行了优化,在LRU列表中加入了midpoint位置,读取最新的页是放在该位置,默认是LRU长度的5/8处。

3、重做日志缓冲

InnoDB首先将重做日志信息放到该缓冲,然后按照一定频率将其刷新到重做日志文件。默认8MB.

4、额外的内存池

2.4  Checkpoint技术

Checkpoint(检查点)技术目的是解决如下问题:缩短数据库的恢复时间;缓冲池不够用时将脏页刷新到磁盘;重做日志不可用时刷新脏页。

2.5  Master Thread 工作方式

2.6  InnoDB关键特性

插入缓冲、两次写、自适应哈希索引、异步IO、刷新邻接页。

2.6.1  插入缓冲

1、Insert Buffer

由于B+树的特性决定了非聚集索引插入的离散性,因而InnoDB设计了Insert Buffer,对于非聚集索引的插入或者更新操作,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引页是否存在缓冲池中,若在,则直接插入;若不在,则先放到Insert Buffer对象中。

Insert Buffer的使用满足:索引是辅助索引,索引不是唯一的。当满足这两个条件InnoDB才会使用Insert Buffer,这样能提高插入操作的性能。

insert buffer 也是B+树实现的。

2、Change Buffer

可以看做是Insert Buffer的升级。可以对insert、delete、update进行缓冲,分别是:Insert Buffer、Delete Buffer、Purge Buffer。

Change Buffer也要求索引是非唯一的辅助索引。

2.6.2  两次写

两次写保证InnoDB数据页的可靠性。

当应用重做日志前,用户需要一个页的副本,当写入失效时,先通过页的副本还原该页,再进行重做,这就是两次写。

两次写组成:一部分是内存中的doublewrite buffer(2MB),另一部分是物理磁盘上共享表空间中连续的128个页,即2个区,大小也是2MB.2.6.

2.6.3  自适应哈希索引

InnoDB会监控对各索引页的查询,如果发现建立哈希索引可以提升速度,则建立哈希索引,这就是自适应哈希索引(AHI)。AHI通过缓冲池的B+树页构造而来。AHI要求对这个页的连续访问模式必须是一样的。、,并且以该模式访问了100次,页通过该模式访问了N次(N=页中记录*1/16)

2.6.4  异步IO

2.6.5  刷新邻接页

当刷新一个脏页时,InnoDB会检查该页所在的区的所有页,如果是脏页,那么一起进行刷新。

2.7  启动、关闭与恢复

第3章  文件

本章介绍MySQL数据库和InnoDB存储引擎的各种类型文件。

参数文件:告诉MySQL数据库实例在哪里可以找到数据库文件,并且指定某些初始化参数等;

日志文件:用来记录MySQL实例对某种条件作出的响应时写入的文件,例如:错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件;

socket文件:当用UNIX域套接字方式进行连接时需要的文件;

pid文件:MySQL实例的进程ID文件;

MySQL表结构文件:用来存放MySQ表结构定义文件;

存储引擎文件:存储引擎真正存储了记录和索引等数据。

3.1  参数文件

MySQL数据库的参数文件是以文本方式进行存储的。

3.1.1  什么是参数?

数据库参数可以看成一个键值对。

3.1.2  参数类型

MySQL数据库中参数分为:

动态参数:可以在MySQL实例运行中进行更改。

静态参数:在整个实例生命周期内都不能更改。

3.2  日志文件

日志文件记录了影响MySQL数据库的各种类型活动。MySQL常见文件:错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件。

3.2.1  错误日志

错误日志文件对MySQL的启动、运行、关闭过程进行记录。可以得到进行数据库优化的信息。

3.2.2  慢查询日志

慢查询日志可以定位可能存在问题的sql语句,从而进行sql层面的优化。

3.2.3  查询日志

查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到正确的执行。

3.2.4  二进制日志

二进制日志记录了对MySQL数据库执行更改的所有操作,不包括select、show这类操作。

二进制日志作用:恢复、复制、审计。

3.3  套接字文件

3.4  pid文件

3.5  表结构定义文件

MySQL数据的存储是根表进行的,每个表都会与之对应的文件。MySQL中以frm为后缀的文件,记录了表的表结构定义,frm还用来存放视图的定义。

3.6  InnoDB存储引擎文件

之前介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。与innoDB存储引擎相关的文件有:表空间文件、重做日志文件,

3.6.1  表空间文件

InnoDB采用将存储的数据按照表空间进行存放的设计。默认10MB,名为ibdata1.

3.6.2  重做日志文件

第4章 表

4.1  索引组织表

在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。若是创建表没有显示定义主键,InnoDB会将表中的第一个非空唯一索引设置为主键,若是没有非空唯一的索引,InnoDB自动创建一个6字节大小的指针。

4.2  InnoDB逻辑存储结构

InnoDB存储引擎将所有的数据存储在表空间中。InnoDB逻辑存储结构:表—段—区—页—行

4.2.1  表空间

表空间是InnoDB所有数据存放的地方。

4.2.2  段

表空间由各个段组成,常见的段有数据段、索引段、回滚段等。数据段就是B+树的叶子节点,索引段就是B+树的非索引节点。

4.2.3 区

区是由连续页组成的空间,在任何情况下每个区都是1MB。为了保证区的连续性,通常InnoDB申请4~5个区。默认页是16kB,即一个区中有64个连续页。

4.2.4  页

页(块)是InnoDB磁盘管理的最小单位,默认16KB,也可以设置为4KB 、8KB、16KB.

常见的页类型:

数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。

4.2.5  行

InnoDB是面向列的,也就是说数据是按行进行存放的。每个页存放16KB/2-200行的记录,就是7992行记录。

4.3  InnoDB行记录格式

InnoDB提供了Compact和Redundant两种格式来存放行记数据。

4.4  InnoDB数据页结构

InnoDB数据页组成:File Header(文件头)、Page Header(页头)、Infimun和Supremun Records、User Records(行记录)、Free Space(空闲空间)、Page Directory(页目录)、File Trailer(文件结尾信息)

4.5  Named File Formats机制

InnoDB通过Named File Formats机制来解决不同版本下页结构兼容性问题。

4.6  约束

4.6.1  数据完整性

关系数据库本身能保证存储的数据的完整性,不需要应用程序的控制。数据完整性有:实体完整性、域完整性(用户自定义完整性)、参照完整性.

InnoDB中的约束:主键约束、唯一约束、外键约束、默认约束

4.6.2  约束的创建和查找

4.6.3 约束和索引的区别

约束是逻辑的概念,用来保证数据的完整性;而索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物理存储方式。

4.6.6  触发器与约束

一个表最多创建6个触发器,分别为insert、update、delete、的before和after各定义一个。

4.7  视图

视图(View)是一个虚表,可以当做表使用,视图中只存放了定义不存放实际的数据,实际的数据还在基本表中。虽然视图是虚表,但是对视图的更新操作本质上是通过

作者:我是一禅呐

链接:https://www.jianshu.com/p/8fc93103d214

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值