一条SQL语句是如何执行的?

前言

我们都知道SQL是声明式语言,作为一名程序媛使用SQL的频繁非常高,那你知道一条SQL是如何被执行的吗,今天我们就从数据库的角度来思考一下SQL是如何被执行的。

MySQL中的SQL是如何执行的

MySQL是典型的C/S架构,即Client/Server架构,服务器端程序使用的是mysqld。整体的MySQL流程如下所示:
在这里插入图片描述
从MySQL的流程中我们知道MySQL由三层组成:
1、连接层:客户端和服务器建立连接,客户端发送SQL至服务器端。
2、SQL层:对SQL语句进行查询处理。
3、存储引擎层:与数据库文件打交道,负责数据的存储和读取。

其中SQL层与数据库文件的存储方式无关,我们来看下SQL层的结构:
在这里插入图片描述
(1)查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端,如果没有,就进入解析器阶段。因为查询缓存的效率往往不高,所以在MySQL8.0之后就抛弃了这个功能。

MySQL8.0之后不再支持缓存的原因:
一旦数据表有更新,缓存都将清空,因此只有数据是静态的时候,或者数据表很少发生变化时,使用缓存查询才有价值,否则如果数据表经常更新,反而增加了SQL的查询时间。

(2)解析器:在解析器中对SQL语句进行语法分析,语义分析。

(3)优化器:在优化器中会确定SQL语句的执行路径,比如是根据全表检索,还是根据索引来检索。

(4)执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行SQL语句查询并返回结果。在MySQL8.0以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

SQL语句在MySQL中的流程是:SQL语句——>缓存查询——>解析器——>优化器——>执行器。

MySQL中的存储引擎

MySQL中的存储引擎采用的是插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的MySQL还允许开发人员设置自己的存储引擎。

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

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

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

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

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

需要注意的是,数据库的设计在于表的设计,而在MySQL中每个表的设计都可以采用不同的存储引擎,可以根据实际的数据处理需求来选择存储引擎,这也是MySQL的强大之处。

总结

不同的DBMS中SQL的执行原理是相通的,只是在不同的软件中,各有各的实现路径。我们要知道不同的RDBMS之间有相同的地方,也有不同的地方,SQL在各种数据库软件中是如何执行的,我们要从全貌的角度来理解这个问题。

发布了191 篇原创文章 · 获赞 219 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Sophia_0331/article/details/105402064