文章目录
一、MySQL架构及工作流程
(一)架构
开始时我们就说过 MySQL的是C/S架构,即客户端/服务器。使用数据库前,我们需要:
- 打开服务器,等待客户端连接。
- 客户端可以使用用户名和密码进行登录。
- 可以多个客户端同时连接服务器。
那么MySQL服务器的内部是如何处理客户端请求的呢,服务器的架构如下:
- 服务器管理模块:管理和控制其他模块。
- 连接池:处理客户端的请求。
- SQL API:处理SQL语句。
- SQL解析器:将SQL语言进行语法,词法分析,编译处理生成二进制语言。
- SQL优化器:对SQL语句执行指向计划,有N个计划,选择最优的进行执行。
- 缓存区:为了平衡磁盘和内存的速度,将部分数据放在缓冲区中。每次现在缓冲区中查看数据,没有就利用存储引擎去底层磁盘查找,找到后会将数据网缓存区存放一份,因为局部性原理(系统会经常访问一定范围的数据)。
- 存储引擎:对底层文件的存储控制,即对底层数据文件的操作方式,对硬盘数据的操作方式;有多种存储引擎,选择哪种,就用怎样的操作方式操作底层数据。
- file set:磁盘硬件驱动,对磁盘数据进行存取控制。
- 日志:记录每一步的执行过程,保证事务的一致性,安全性。
(二)工作流程
当客户端连接服务器后,服务器中的处理流程:
- 连接池模块,唤醒连接池里连接的模块,处理客户端连接。
- 服务管理模块,从mysql库中查询是否有对应客户端名称和密码,有,客户端连接成功,没有登录失败
- 连接成功后,服务器阻塞等待客户端发送请求。
- 假如客户端发送查询语句,连接池接收到数据,进行处理
- 进入SQL API,结构化查询语句接口模块,核心处理DDL,DML语句。此时不会进行查询处理,因为机器只识别0,1码,所以进入下一个模块
- SQL解析器模块,类似于编译的过程,进行词法分析,语法分析。如果出错,给客户端显示结果,没出错就进入下一个模块
- SQL优化器:针对SQL语句进行优化,产生执行计划,即执行流程,可能一条SQL语句产生多条执行计划,最后选择最合适的执行。
- 执行SQL语句后,进入缓冲区查找数据,找到直接给客户端。找不到去磁盘中去找。
- 当缓冲区找不到时,将查询语句交给某一个存储引擎,存储引擎根据自身对底层文件的操作,在磁盘文件上查找数据,找到后,进行日志记录,将数据给缓冲区放一份,沿着连接结果给客户端。
我们画出流程图,如下:
二、存储引擎简介
存储引擎:对底层数据的读写操作,基于表。
MySQL是插入式存储引擎的数据库,即存在存储引擎接口,选择不同的存储引擎,对底层数据的操作(读写方式)不同,通过选择使用不同的存储引擎提高MySQL的效率。
(一)常见的四种存储引擎概述
1. MyISAM
Linux版本5.5版本前默认MyISAM存储引擎,以后默认为InnoDB;对在线分析处理操作速度快。
- 支持全文索引:即支持给vachar,text字段建立索引,不支持外键
- 支持表锁:加锁会给一张表加锁,加锁之后,其他行也不能被操作。读锁称为共享读锁,写锁称为独占写锁。
- 执行SQL语句时,底层系统自动加锁:select加读锁;insert,delete,update加写锁。
- 不支持事务,即不支持回滚操作,当发生错误时,需要程序进行回滚,系统不会自己处理。
- 默认B+树索引,将数据和索引分开存储,实现了索引和数据分离,只需要在索引结点存储数据地址就可以找到数据,所以数据可以随机或者离散的分布,将这种称为非聚集索引。
2. InnoDB
Windows默认InnoDB存储引擎,面向在线事务处理方面的应用。
-
不支持全文索引,即不能给text,varchar字段加索引。
-
支持外键
-
默认行锁:给一行数据加锁,不影响其他行,粒度小,支持表锁;读锁:共享锁,写锁:排他锁。
-
select不加锁,因为SQL语句是一个事务,可以通过事务的隔离性和一致性保证事务并发执行。insert,delete,update操作加写锁。存在超时机制,如果阻塞操作超时,就自动取消此次操作。
-
支持事务:一条SQL语句当作一个事务,那么当一个事务执行完成后即遇到SQL语句的分号时,将所有的资源,锁都释放,提供了提交、回滚、崩溃恢复能力的事务安全。
-
支持数据缓存。
-
默认B+树索引,索引当作数据的一部分,数据存储在索引上,也就是说要存储数据,必须要有索引的存在,没有主键,没有唯一键,为每一行生产一个6字节的行id,作为主键。索引结构决定了数据范围,将此称为 聚集索引。
3. MEMORY
内存存储引擎,数据在内存中存储,不支持存储大数据。
- 数据不安全,断电数据丢失
- 把varchar当作char类型处理,浪费内存,但是速度快了
- 不支持text(大文本字段),BLOB(图片字段),太大了
- 用来 存储临时表,作为临时使用,如果临时表中存在text字段,那么系统会将text字段用MyISAM存储引擎在磁盘中存储,其他字段MEMORY存储引擎处理。这样还需要建立内存和磁盘的关系,所以尽量不要使用text字段。
- 默认哈希索引,可以使用B+索引
RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使zhi用的程序。ROM(Read-Only Memory)即只读内存,是一种只能读出事先所存数据的固态半导体存储器。RAM和ROM分别对应电脑的内存和硬盘,所以 MEMORY存储器类似于RAM随机存储内存。
4. ARCHIVE
归档/压缩存储引擎,以1:10的比例进行压缩,那么查询时需要解压,耗费时间长,适用于数据量大,查询少的数据,如日志数据(记录程序的每一步执行流程,结果等)
- 只支持insert,select操作,不支持update,delete,因为耗费时间太大了。
- 主要提供插入和压缩功能
(二)四种存储引擎的对比
一张表对四种存储引擎进行总结:
功能 | MyISAM | Memory | InnoDB | Archive |
---|---|---|---|---|
存储限制(一张表) | 256TB | RAM | 64TB | None |
支持事务 | ❌ | ❌ | ✅ | ❌ |
支持全文索引 | ✅ | ❌ | ❌ | ❌ |
支持数(树)索引 | ✅ | ✅ | ✅ | ❌ |
支持哈希索引 | ❌ | ✅ | ❌ | ❌ |
支持数据缓存 | ❌ | 不相关N/A | ✅ | ❌ |
支持外键 | ❌ | ❌ | ✅ | ❌ |
- MyISAM:一般管理非事务表;数据文件和索引文件存放位置不同,具有全文搜索的能力,可以提供高速存储和检索,插入和查询速度快。
- InnoDB:用于事务处理表,支持ACID事务,提高乐具有提交,回滚和崩溃恢复能力的事务安全;和MyISAM存储引擎队医,效率差一点,需要占用更多的磁盘空间来保存数据和索引。
- Memory:数据存放在内存中,数据量小,速度快。一般用于存储临时数据,即中间结果。
- Archive:支持高并发的插入操作,只支持插入,查询操作,具有压缩机制,所以非常适合存储数据量大,查询小的数据,如日志。
(三)存储引擎的操作
【1. 查看存储引擎:】
show engines;
Support列的含义: YES表示支持,NO表示不支持,DEFAULT表示当前数据库版本默认的存储引擎。
【2. 建表时设置存储引擎:】
create table test (name char(10),age int) engine = myisam;
【3. 修改一个表的存储引擎:】
alter table test engine = innodb;
加油哦!🍚。