MySQL 面试系列:一条select语句在MySQL是这样执行
其它MySQL 面试系列:
MySQL 面试系列:一条select语句在MySQL是这样执行的?
MySQL 面试系列:MySQL 常见的开放性问题
MySQL 面试系列:MySQL 性能优化 & 分布式
MySQL 面试系列:MySQL 命令和内置函数
MySQL 面试系列:MySQL 中日志的面试题总结
MySQL 面试系列:MySQL 中锁的面试题总结
MySQL 面试系列:MySQL 事务的面试题总结
MySQL 面试系列:MySQL 索引的面试题总结
MySQL 面试系列:MySQL 基础模块的面试题总结
一、从宏观的角度分析MySQL
首先看一张经典图片
image这幅图估计很多人都看到过,也是经典之作高性能 MySQL 里边的。
闲话少说,进入正题。
上图的客户端可以直接理解为 PHP、Java 等。接下来,你会看到连接、线程处理。这一部分并不是 MySQL 所特有的,而且大多数客户端、服务器都具有类似的结构。
因此,一般而言,MySQL可以分为两层:Server层
和 存储引擎层
。
Server层
主要包括连接层、查询缓存、分析器、优化器、执行器等重要模块组成,这一层还包含了 MySQL 核心 Api 部分,比如常用的格式化时间、加密等。
存储引擎
大家都很熟悉,因为在面试中经常被问到的的问题: Innodb
、Myisam
存储引擎的不同。
所以想过没有,MySQL 为什么会有这么多的存储引擎呢?
一切技术起源于当下问题,同样在 MySQL 中也不例外。
MySQL 在存储引擎这一方面的架构是插件式的,即可以随意切换不固定,而且 MySQL5.5 版本存储引擎已经默认为 Innodb
。
二、一条SQL执行要经过多少困难?
下图是一条 SQL 执行的主要流程
image.png图中还有一个熟悉的陌生人查询缓存模块
,该模块在MySQL8.0中已不存在。
关于该模块为何要被删除,后续的文章也将于大家交流。
首先,我们将大致了解当我们执行一条SQL语句时,如何在这个架构图中运行。
2-1 连接器
mysql -u root -p
连接数据库命令,在执行之后,你将需要输入密码。当完成经典的TCP握手之后,连接器就开始发挥作用了。
如果码错误时,则返回Access denied for user ‘root‘@‘localhost‘ (using password: YES
,错误编码1045。
如果连接信息均正确,则此时将根据你输入的用户访问权限表来获取该用户的权限,此处必须清楚,当你登录成功后,即使其他人修改了你的权限,在这个连接未断开之前你的权限是不会发生改变的。
当你连接完成之后,如果你一直不做任何事情,执行show processlist将会看到一个sleep,表示空连接。
那么你知道在MySQL中,如果连接成功后没有进行任何操作,多久会被自动中断?
可以执行show variables like 'wait_timeout';
用于查看时间。