1. MySql基础架构

MySql你肯定很熟悉,如果你看到这篇文章,想必你和数据库打交道已经很多年了,你感觉MySql是那么熟悉,无非不就是增删改查吗?

嗯,你答对呢,我没办法否认绝大多数的程序员每天确实就是做的这些事情,我想得也很你一样,我接下来就是要给你看一个非常简单得查询语句

select * from tabl1 where id = 1;

这个tabl1比你业务中中觉多数表都简单,我现在假设他只有一个列【id】,假设表中确实有数据,那么查询出得结果只有一条,而且只会有一个列,很好一切都和你想得一样,太简单了。

我接下来想问,这个sql语句在MySql内部是怎么执行的,你能回答得上来吗?如果感觉答不上来,正好,请继续往下看……

接下来我想做得事情就是把这个你认为很简单得sql拆散来看,在这个过程中如果你能对MySql的架构有深入的理解,我想这就是我想要的收获。

host mysql查看用户select mysql 查看用户表_SQL

首先下上图,别吃惊,我知道你肯定吓了一跳,我接下来要做的事情就是把整个大的图分成一部分一部分的来看,尽量把他简化,我大概把它分成连接层,Sql处理层,存储引擎层

1.1. 连接层

host mysql查看用户select mysql 查看用户表_mysql 查询某个用户下的表_02

这个图看起来就简单多了,首先你要执行一个sql一句,你肯定要打开客户端,连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的某个操作)

这个应该不陌生吧,你在安装的时候应该就使用过用户名,密码,设置也配置让root用户能远程登陆等功能了,确实服务器就是对你的这些进行了相应的处理,然后呢?

你登陆成功后,你就发送了一条sql语句过去了,后台怎么执行呢?

1.2. SQL处理层

权限通过了,服务器确认你具有访问数据库数据的权限,你的sql语句也已经准备好,就下来就轮到Sql处理层登场了

host mysql查看用户select mysql 查看用户表_服务器_03

总体来讲,这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如:存储过程、触发器、视图等。

还是分步骤来看吧

1.如果是查询语句(select语句),首先会查询缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步)

2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析;

3.优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。

是不是感觉不那么简单了?

1.3. 存储引擎层

最终的数据还是落在存储层,而在mysql中存储层是有各种存储引擎的,有存储引擎来负责数据的存储和提取

host mysql查看用户select mysql 查看用户表_SQL_04

再来看下这图,存储引擎在mysql中不只一个,为了方便切换,其架构是插件式的,类似于设计模式里面的适配器模式,虽然上面看到有很多的存储引擎,但用得最多得还是InnoDb,它从MySql 5.5.5版本开始已经成为了默认得存储引擎

也就是说,如果你不做任何关于存储引擎得配置,如果你创建一个表,它默认使用的就是Innodb

当然,存储引擎不只有Innodb,还有其他常见的存储引擎,比如说:

MyIsam: 5.5之前默认的存储引擎,支持表压缩,只支持表锁,如果非事务性的查询可以考虑使用

Innodb:mysql默认的存储引擎,支持行锁,唯一支持事务的存储引擎。

CSV:以csv格式进行存储,索引列都不能为null,不支持索引,可以对数据文件直接变更

Archive:会使用zlib方式对数据进行压缩,但只支持insert 与select,只能在id上创建索引

Ferderated:默认不开启,需要修改配置文件开启,提供远程访问其他服务器上面的表的功能,本地不存放数据