MySQL——进阶篇1-存储引擎

MySQL体系结构

1.连接层

接收客户端的连接处理,认证授权能查看哪些数据库哪些表能进行哪些操作,安全方案,是否超过最大连接数等等。服务器也会为安全接入的每个客户端验证它具有的操作权限。

2.服务层

绝大部分核心功能都是在服务层完成的,sql接口、解析器、查询优化器、缓存都是在服务层完成的

3.存储引擎层

真正的负责MySQL数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎功能不同,这样可以根据不同的需求选择合适的存储引擎。存储引擎是可插拔式的,可以扩展。索引是在存储引擎实现的,不同的存储引擎索引结果是不同的。InnoDB是MySQL 5.5之后默认的存储引擎

4.存储层

用来存储数据库的相关数据的,并完成与存储引擎的交互。数据库的数据最后是存储在磁盘当中的,包含一列的日志、数据、索引、二进制、错误日志、慢查询日志等
MySQL——进阶篇1-存储引擎_第1张图片

存储引擎简介

1.简介:

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。
不同的存储引擎数据存储、索引建立、更新、查询方式不同。一个库的不同表可以使用不同存储引擎。
MySQL 5.5之后默认的是InnoDB。

2.查询当前数据库支持的存储引擎

SHOW ENGINES;

MySQL——进阶篇1-存储引擎_第2张图片
Engine:有哪些存储引擎
Support:是否支持
Comment:注释
Transactions:是否支持事务
XA:是否支持XA协议
Savepoints:是否支持保存点

存储引擎特点

一. InnoDB引擎

1. 介绍:

是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL 5.5之后是默认的存储引擎

2. 特点:

1)DML(sql的增删改)操作遵循ACID(事务的4大特性)模型,支持事务
2)行级锁,提高并发访问性能
3)支持外键约束,保证数据的完整性和正确性

3. 文件:

格式xxx.ibd,xxx代表的表名,InnoDB引擎的每张表都会有这样的表空间文件,存储该表的表结构(frm、sdi数据字典)、数据索引

在8.0 之前InnoDB存储表的结构和数据时,分别存储在frm文件和ibd文件。而在8的时候全都存到了ibd文件里,8.0之后表结构存储在sdi数据字典当中,sdi文件又融入到了ibd文件。

参数:innodb_file_per_table 决定是否每个表一个表空间还是共用表空间。mysql 8.0后打开的代表每个表对应一个表空间。
查询sql:

SHOW VARIABLES LIKE 'innodb_file_per_table'

在这里插入图片描述
不能直接查看idb文件,因为是二进制的

4. 逻辑存储结构:

MySQL——进阶篇1-存储引擎_第3张图片

1)组成:
(1)TableSpace:表空间(idb文件)
(2)Segment:段
(3)Extent:区
(4)Page:页
(5)row:行
2)关系:
一个表空间包含多个段,一个段有多个区,一个区有多个页(如数据页、索引页),一个页有多个行(行就是表结构中一行一行的数据),一行包含最后一次操作的事务的id、指针、字段。
InnoDB的逻辑当中Page页是磁盘操作的最小单元,一个区的大小是固定的1M,一个页的大小也是固定的16K,所以一个区可以包含64个页。

二. MyISAN

1. 介绍:

是MySQL早期默认的存储引擎

2. 特点:

1)不支持事务、不支持外键
2)支持表锁,不支持行锁
3)访问速度快

3. 文件:

1 )xxx.MYD:存放的表中的数据
2 )  xxx.MYI:存放的索引
3 )  xxx.sdi:存放的表结构信息(可以直接查看存储的JSON格式)

三. Memory

1. 介绍:

表数据存放在内存当中的,由于受到硬件、断点问题的影响,只能将这些表作为临时表或缓存使用。

2. 特点:

1)存在在内存中的
2)hash索引(默认)

3. 文件:

	xxx.sdi :存储表结构信息  	 

接下来通过图片对比三种引擎
MySQL——进阶篇1-存储引擎_第4张图片

存储引擎选择

存储引擎没有好坏之分,在合适的情况下选择合适的存储引擎

1. InnoDB:

是MySQL默认的存储引擎,支持事务、行锁、外键。例如对事务的完整性较高、并发情况下一致性较高适合

2. MyISAM:

如果以读取和插入为主,只有少量的更新、删除操作,对完整性、并发性要求不高适合(如日志、电商的足迹、评论,实际工作中 用NoSQL mongodb )

3. MEMORY:

所有数据存放在内存中,访问速度快,适用于临时表和缓存。太大的表无法存入内存中而且安全没有保障。(内存和磁盘不一样,磁盘可以存储T级别甚至更多的,但是内存不同,代价很大。实际工作中使用NoSQL Redis)

你可能感兴趣的:(mysql,mysql,数据库,服务器)