【MySQL 实战】01. SQL 查询语句是如何具体执行的呢?

1. 思考

我们通常输入一条SQL语句,得到一个返回结果,但是这个SQL 语句的具体执行路径是怎样的呢?今天让我们一起来探究一下 MySQL 查询语句在 MySQL 数据库中具体的执行过程。

mysql> select * from player where id=1;

我们先看一下MySQL数据库的逻辑架构图,我们可以将MySQL分为服务层,存储引擎层两部分。【MySQL 实战】01. SQL 查询语句是如何具体执行的呢?_第1张图片
有时分为三层,连接器独立变为一层,为连接层。从此图看,数据表的数据是存在存储引擎当中的。写一下建表语句,看一下表的DDL,看看你的数据表默认存储引擎是哪个?
【MySQL 实战】01. SQL 查询语句是如何具体执行的呢?_第2张图片

2. SQL 语句执行过程

1. 建立连接
客户端与连接器通过TCP协议完成三次握手以后,建立连接,获取权限,维持和管理连接等。(也就是我们通过用户名密码登陆的过程)。

客户端与服务端建立连接后,如果客户端持续发送请求,此时可以一直使用同一个连接,这样可以减少连接的动作。但是客户端长时间不发送请求到服务端,此时服务器内存就会爆涨,内存占用过大,造成资源紧张,有可能造成数据库重启。

如何解决上述长连接占用资源的问题呢?

  1. 定期断开长连接。执行完一个较大查询后,断开重连。
  2. MySQL 5.7 版本及其以上版本,当完成一个较大的查询后,可通过执行 mysql_reset_connection 重新初始化连接资源,将连接恢复到创建时的状态,且该过程不需要重连和重新做权限验证。

长连接与短连接

长时间使用一个连接,称长连接。长连接的时长默认为8小时,当然可以通过修改 wait_timeout 进行修改。相反短连接就是执行很少次数的查询就会断开连接,再次查询的时候重新建立连接。

2. 查询缓存 :mysql8.0 删除了查询缓存的功能

建立连接后,通过查询缓存,查看最近是否执过此查询语句,如果有,则直接返回结果(此时有一个过程,命中缓存后,还要查看你是否有权限,没有权限也会直接报错),如果没有命中查询缓存,则进入分析器。

这里面我们说一下查询缓存,数据库中有一个CPU缓冲池,是一个内存的结构,存放最近查询的数据,数据以键值对的形式存在,查询速率很快。

查询缓存有什么缺点呢?

如果数据表中的一条数据更新,则查询缓存将全部丢失,而且命中率很低。个人感觉,缓冲池适合对一些不经常进行增删改类型的数据表,例如数据仓库,但是想了想,数据仓库数据量很大,然而数据库缓冲池内存有限,这大概就是MySQL 8.0 版本直接将查询缓存的整块功能删掉的原因吧,只是我的个人想法。

3. 分析器

分析器主要对 SQL语句进行语法和语义分析。分析SQL语句是否能执行。

语法分析:检查 SQL 拼写是否正确,是否符合SQL标准,不符合就报错
You have an error in your SQL syntax。

语义分析:语法分析以后,发现没错,此时查看SQL语句中的字段是不是数据表中的字段,如果不是,报错。
1054 - Unknown column ‘player_id’ in 'field list’

4. 优化器

相同的SQL语句,执行路径存在一定的差异,是按照全表扫描呢,还是根据索引查找的,不同的执行路径,效率也会不同。此时优化器形成执行计划,选择效率快的执行路径。

5. 执行器

执行器,在执行SQL语句的时,首先检查你对要查询的表,是否有权限,没有权限,直接报错 ERROR 1142 (42000):SELECT
command denied to user ‘b’@‘localhost’ for table ‘player’
反之打开表,根据表定义的存储引擎,找到该表的引擎接口,在存储引擎中查找相应的记录,封装成结果集返回给客户端。从而完成一条SQL语句的执行。

mysql 存储引擎

MySQL 的存储引擎以插件的形式存在于MySQL数据库中,且每个存储引擎都面向一种特定的数据库应用环境,开发人员可以设置自己的存储引擎。

MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。

InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。

Memory 存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果 mysqld进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用 Memory 存储引擎。

NDB 存储引擎:也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。

Archive 存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库

关于SQL查询流程我们先分享到这里,那么增删改一条语句的流程和查询流程一样么?显然大致是一样的,但是还有不同之处,毕竟查询流程并未对表中的数据做任何修改,增删改的加入了 redo log (重做日志)和binlog (归档日志)。下篇让我们一起学习一下这两个重要的日志模块的神奇之处吧。
我 C,昨天不小心修改了数据库中的一条数据,请问DBA 能帮我恢复一下数据库原有的数据呢?DBA 说别说是恢复昨天的数据,一周前的,半月前的都是简简单单的啦。DBA 是如何实现的呢?

你可能感兴趣的:(MySQL,数据库)