给隔壁的妹子讲『一个SQL语句是如何执行的?』

前言

SQL做为Web开发是永远离开不的一个话题,每天写SQL,但是你知道一个SQL是如何执行的吗?mysql

select name from user where id = 1;

上面是一个简单的查询语句,交给数据库去执行,而后返回name。看起来很简单,但是内部的执行过程却不少人都不知道。面试

今天就把MySQL拆开看看,看一下它到底是怎么工做的。算法

SQL基本架构

1595328824023

从上图能够看出,MySQL分为Server层和存储引擎层sql

Server层

链接器

链接器主要是与客户端创建链接, 包含本地socket和大多数基于客户端/服务端工具实现的相似于tcp/ip的通讯。 链接成功以后会同时校验用户的权限,等相关安全方案。如咱们经常使用的创建链接方式数据库

mysql -h ip -P 3306 -u root -p
链接是能够在-p后面输入密码,可是考虑到安全问题 不建议这样操做,-P 后是端口号,-p 是密码。注意大小写。

登陆成功以后,会校验固然登陆帐号的权限。后续全部的数据库操做都被当前权限所限制。所以,管理员修改用户权限时,不会当即生效,须要从新链接才会生效。windows

MySQL默认状况下,当一个连接空闲超过8(60 60 8)小时以后会自动断开链接。可是链接池则觉得该被断开的链接依然有效。 这个时候若是客户端代码发送请求时,链接池会把已经失效的代码返回至客户端。这样就会致使代码异常。缓存

经过show global variables like '%timeout%'可进行查看, 缺省状况下是使用wait_timeout 这个字段。安全

img

另外能够用show processlist; 用来显示用户正在运行的线程。架构

注意:除了 root 用户能看到全部正在运行的线程外,其余用户都只能看到本身正在运行的线程,看不到其它用户正在运行的线程。除非单独个这个用户赋予了PROCESS 权限。
mysql> show processlist;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time | State                  | Info             |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
|  4 | event_scheduler | localhost | NULL | Daemon  |  461 | Waiting on empty queue | NULL             |
| 13 | root            | localhost | NULL | Query   |    0 | starting               | show processlist |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+

查询缓存

当咱们创建链接以后,执行SQL语句时,会先进行缓存查询(若是开启了缓存查询)。若是以前执行了相同的SQL语句,则会从缓存中直接返回结果。 这个过程能够理解为SQL文本和查询结果的映射。并发

可是查询缓存真的能提高效率吗? 理论上,不建议开启查询缓存

由于缓存和失效都会有额外的资源消耗,数据发生改变或者表结构发生改变时,都会致使缓存失效。最差的状况就是你刚创建了一份缓存,另一边又有人修改数据。这样致使缓存失效,从新创建了一份新的缓存。

有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会致使缓存数据失效。因此查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用

在MySQL8.0的版本删除了查询缓存的功能。

若是你是8.0以前的版本,能够经过如下方法关闭查询缓存:

一、临时关闭,直接执行命令行

set global query_cache_size=0

set global query_cache_type=0

二、永久关闭,修改配置文件my.cnf ,添加下面的配置便可。

query_cache_type=0

query_cache_size=0

分析器

当在查询缓存中没有找到对象的查询结果时,这时候就须要分析器对SQL进行解析。好比解析出响应的关键词。如Select(查询)、Delete(删除)等等,同时也会把相应的代表、字段名都分析出来。若是SQL语法错误,会告诉咱们 You have an error in your SQL syntax

优化器

SQL实际的执行顺序不必定就是咱们写的顺序。在经过分析器的解析,数据库知道了咱们要作什么。而后会按照必定的规则重写SQL。当有多个索引的时候,优化器也会决定去使用哪一个索引;当多表关联查询的时候,也会去决定各个表的连接顺序。总之,优化器会经过一系列的算法规则去给出一个最优的执行策略。

执行器

SQL经过分析器知道要作什么,经过优化器知道该怎么作。最后经过执行器就进入了执行阶段。

首先会根据链接的帐号查看是否有操做该表的权限。若是没有,则返回权限错误。若是有权限,则继续执行。

打开表的时候,执行器会根据表的引擎 去使用该引擎提供的接口。

存储引擎层

存储引擎层负责数据的存储和提取。

可经过show engines查看MySQL的存储引擎。存储引擎有 InnoDB MylSAM MEMORY MERGE 等等..

1595356537614

可是咱们经常使用的基本是InnoDBMylSAM

InnoDB在5.5.5版本以后为默认的存储引擎

InnoDB

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,提供了具备提交,回滚和崩溃恢复的事务安全,可是对比MyLSAM引擎,写的效率会比差一些,而且会占用更多的磁盘空间以保持数据和索引。

特色:

  1. 更新多的表,适合处理多重并发的更新请求。
  2. 支持事务。
  3. 能够从灾难中恢复(经过bin-log日志等)。
  4. 外键约束。只有他支持外键。
  5. 支持自动增长列属性auto_increment。

MylSAM

Mylsam 存储引擎独立于操做系统,简单说就是可用在windows上使用,也可用将数据转移到Lunex操做系统上。系统兼容性很好!!!。这种存储引擎在建表的时候,它会建立3个文件。分别是(.frm, .MYD, .MYI),简单说明一下:.frm 存储表的定义(也就是表结构啦),.MYD 就是表里面的数据,.MYD存储索引。这样的划分操做系统对大文件的操做是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据天然能够优化数据库的查询等操做。

特色:

一、不支持事务

二、不支持外键

三、查询速度很快。若是数据库insert和update的操做比较多的话采用表锁效率低(建议使用innodb)。

四、对表进行加锁

总结

Server层涵盖了MySQL执行的大多数的核心功能,以及各类各样的内置函数,好比时间、日期等,无论使用的是什么存储引擎,它的Server层是同样的。以上就是对一个SQL执行流程的简单介绍。感谢你们的阅读!

文末福利

肝了全网,43份Java思惟导图,须要自取!!!

《Java面试手册》V1.0版本,高清PDF免费获取

相关文章
相关标签/搜索