MySQL 学习笔记一【总体结构】

============================================

MySQL学习笔记【第一部分】

============================================

一. MySQL架构图

MySQL 学习笔记一【总体结构】_第1张图片

  • Client Connectors 接入方 支持协议很多
  • Management Serveices & Utilities 系统管理和控制工具,mysqldump、 mysql复制集群、分区管理等
  • Connection Pool 连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求
  • SQL Interface SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果
  • Parser 解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的
  • Optimizer 查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化
  • Cache和Buffer(高速缓存区) 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据
  • pluggable storage Engines 插件式存储引擎。存储引擎是MySql中具体的与文件打交道的子系统
  • file system 文件系统,数据、日志(redo,undo)、索引、错误日志、查询记录、慢查询等

以下部分只针对上图中的常用引擎进行介绍

首先要明白,存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB、MyISAM、Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Memory都不用磁盘来存储数据。在介绍常用引擎前,希望读者能明白计算机局部性原理,我将针对局部性原理做简要概述。现在我将介绍InnoDB、MyISAM、Memory、CSV、Archive。

0. 计算机局部原理

首先要明白局部性原理能解决的是什么问题,也就是主存容量远远比缓存大,CPU执行程序的时候需要使用内存块,如果该内存块在缓存上,那么处理器直接从缓存上取该内存块就行了,因为缓存的数据传输的速率比内存快的多。因为主存容量大,所以要取的内存块很可能不在缓存上,因此就要把这个内存块移到缓存上。局部性原理就是解决这个问题:
举个例子:空间局部性,我们就可以选择在读取内存块的时候将该内存块附近的内存块也读进缓存中。称为预取(prefetch)

局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
三种不同类型的局部性:

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
    程序循环、堆栈等是产生时间局部性的原因。
  • 空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的。
  • 顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。

指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。

1. InnoDB

在InnoDB中,数据会存储到磁盘上,在真正处理数据时需要先将数据加载到内存,表中读取某些记录时,
InnoDB存储引擎不需要一条一条的把记录从磁盘上读出来,InnoDB采取的方式是:将数据划分为若干个页,以
页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB,也就是说,当需要从磁盘中读数据时
每一次最少将从磁盘中读取16KB的内容到内存中,每一次最少也会把内存中的16KB内容写到磁盘中。
页是InnoDB管理存储空间的基本单位,一个页的大小默认是16KB。

SHOW GLOBAL STATUS like 'Innodb_page_size';
InnoDB页结构

MySQL 学习笔记一【总体结构】_第2张图片
MySQL 学习笔记一【总体结构】_第3张图片InnoDB行格式
一行记录可以以不同的格式存在InnoDB中,行格式分别是Compact、Redundant、Dynamic和Compressed行格
式。
我们可以在创建或修改表的语句中指定行格式:

CREATE TABLE 表名(列信息) ROW_FORMAR=行格式名称
ALTER TABLE 表名 ROW_FORMAR=行格式名称

在这里插入图片描述
记录头信息
MySQL 学习笔记一【总体结构】_第4张图片记录的真实数据
MySQL 学习笔记一【总体结构】_第5张图片Dynamic和Compressed行格式
这两种格式类似于Compact行格式,只不过在处理行溢出时有点分歧,它们不会在记录的真实数据处存储一部分数据,而是把所有的数据都存储在其他页面中,只在记录的真实数据处存储其他页面的地址,另外,Compressed行格式会采用压缩算法对页面进行压缩

2. MyISAM

Mysql5.5版本之前的默认存储引擎 较多的系统表也还是使用这个存储引擎 系统临时表也会用到Myisam存储引擎
特点:

  • select count(*) from table 无需进行数据的扫描
  • 数据(MYD)和索引(MYI)分开存储
  • 表级锁
  • 不支持事务
3. Memory

数据都是存储在内存中,IO效率要比其他引擎高很多 服务重启数据丢失,内存数据表默认只有16M
特点:

  • 支持hash索引,B tree索引,默认hash(查找复杂度0(1))
  • 字段长度都是固定长度varchar(32)=char(32)
  • 不支持大数据存储类型字段如 blog,text
  • 表级锁

应用场景:

  • 等值查找热度较高数据
  • 查询结果内存中的计算,大多数都是采用这种存储引擎 作为临时表存储需计算的数据
4. CSN

数据存储以CSV文件
特点:

  • 不能定义没有索引、列定义必须为NOT NULL、不能设置自增列【不适用大表或者数据的在线处理】
  • CSV数据的存储用,隔开,可直接编辑CSV文件进行数据的编排 【数据安全性低】、

应用场景:

  • 数据的快速导出导入
  • 表格直接转换成CSV
5. Archive

压缩协议进行数据的存储,数据存储为ARZ文件格式
特点:

  • 只支持insert和select两种操作
  • 只允许自增ID列建立索引
  • 行级锁
  • 不支持事务
  • 数据占用磁盘少

应用场景:

  • 日志系统
  • 大量的设备数据采集
各存储引擎对比:

MySQL 学习笔记一【总体结构】_第6张图片
:本文只是对于MySQL体系结构的总结,若想深入学习可参考官网

你可能感兴趣的:(MySQL,MySQL架构,MySQL体系总结)