MySQL基础架构:一条SQL“查询语句”是如何执行的
0. MySQL的基础架构图:
(图片来自极客时间:https://time.geekbang.org/column/article/68319)
大体来说,MySQL可以分为Server层(服务器层) 和 存储引擎层 两部分。
Server层 包括 连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而 存储引擎层 负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多种存储引擎。现在最常用的存储引擎是 InnoDB,它从MySQL 5.5.5 版本开始成为了默认存储引擎。
从图中不难看出,不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。
下面依次看下每个组件的作用。
1. 连接器:
客户端如果太长时间没动静,连接器就会自动将其断开。
这个时间是由参数 wait_timeout 控制的,默认值是8小时。
mysql> show global variables like "%timeout";
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
| wait_timeout | 28800 |
+---------------------+-------+
如果在连接被断开之后,客户端再次发起请求的话,就会收到一个错误提醒:
Lost connection to MySQL server during query.
这时候如果你要继续,就需要重连,然后再执行请求。(mysql_ping + reconnect_opt)
由于连接建立的过程复杂且开销大,一般建议使用长连接。而长连接有一个问题就是MySQL在执行过程中临时使用的内存都会存放到连接对象中,长时间不释放持续累积会导致内存占用过大。
解决方式是:
客户端主动定期断开长连接,或者执行一个占用内存的大查询后断开连接再重连:
调用执行 ‘mysql_reset_reconnection’ 来重新初始化连接资源,无需重连、无需权限验证,会使连接恢复到新建完成时的状态。
int mysql_reset_connection(MYSQL *mysql);
2.查询缓存:
查询缓存弊大于利,查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。除非你的业务就是一张静态表,很长时间才会更新一次。
可以将参数 ‘query_cache_type’ 设置成 DEMAND,这样对于默认的SQL语句都不使用查询缓存,而对于你确定要使用查询缓存的语句可以使用 ‘SQL_CACHE’ 显式指定:
mysql> select SQL_CACHE * from T where ID = 10;
MySQL 8.0 版本 直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。
3.分析器:
分析器:通过分析器 知道要做什么。
分析器 先做 “词法分析”,再做“语法分析”,“词法分析”将select等关键字从你输入的字符串中识别出来,再识别出表名、列名 等;“语法分析”检查输入的语法是否有错误,例如“select”输入成了“elect”。
4.优化器:
优化器:通过优化器知道 该怎么做。
当表里有多个索引时,优化器决定使用哪个索引;
或者当一个语句有多表关联(join)的时候,决定各个表的连接顺序。
select * from t1 join t2 using(ID) where t1.c = 10 and t2.d = 20;
5.执行器:
开始执行的时候,要先判断一下你对这个表是否有执行查询的权限。
select * from T where ID = 10;
执行过程是这样的:
如果这个表没有索引,则执行器调用 存储引擎的 ‘取下一行’ 接口,取出数据后判断ID的值是否等于10,如果不是则跳过,如果是则将这行存入到结果集中,重复调用存储引擎的接口取下一行,直到取到这个表的最后一行。
如果这个表有索引,则执行器调用存储引擎的 ‘取满足条件的第一行’ 接口,之后循环调用 ‘取满足条件的第一行’ 接口,这些都是存储引擎中已经定义好的。
MySQL基础架构:一条SQL“查询语句”是如何执行的相关推荐
- 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...
- 怎么做mysql查询系统_mysql数据库系统学习(一)---一条SQL查询语句是如何执行的?...
一.第一节:一条sql查询语句是怎样执行的 5.5.5版本以后,默认使用存储引擎为InnoDB 不使用查询缓存,MySQL8.0没有查询缓存这个功能 总体来说:MySQL分为service层和存储引擎 ...
- 听说你写sql很溜,一条sql查询语句是如何执行的?
我们项目中必不可少要与数据库接触,那么一条sql查询语句是如何执行的呢? 本文以MySQL数据库为例.MySQL是典型的C/S架构(client客户端/server服务端),客户端进程向服务端进程发送 ...
- MySQL番外篇:一条SQL查询语句是如何执行的?
在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...
- 一条SQL查询语句是如何执行的? MySql杂谈
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- 01 | 基础架构:一条 SQL 查询语句是如何执行的
1. MySQL整体架构预览 MySQL 的基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL的各个功能模块中的执行过程. 大体来说,MySQL 可以分为 Server 层和存储 ...
- 01 | 基础架构:一条SQL查询语句是如何执行的?笔记(转)
连接器 第一步,你会先连接到这个数据库上,这时候接待你的就是连接器.连接器负责跟客户端建立连接.获取权限.维持和管理连接.连接命令一般是这么写的: mysql -h$ip -P$port -u$use ...
- 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...
- 执行sql语句_一条SQL查询语句是如何执行的?
本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构. 首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句: select * from user_inf ...
最新文章
- 提高mysql性能的开源软件
- java整数类型int字面值_JavaKotlinAndroidGuide
- c语言倒计时不影响进程_2017级C语言大作业 - 见缝插针
- 使用对象操作流程,读写文件
- 【itext学习之路】--6.将html转成pdf(解决中文不显示)
- 从数学到计算机 从莱布尼兹到冯诺依曼 从数理逻辑到算法分析
- Java 基础整理(一)
- C#接口的使用场合,接口应用
- Linux下创建与解压zip, tar, tar.gz和tar.bz2文件
- NFC Enable 过程分析(三)
- 一题多解 —— python ndarray 的 value_counts
- 取得人生成功的40条定律
- spss数据预处理步骤_关于SPSS数据预处理心得
- R语言基于mgcv包进行广义可加模型及交互作用演示(2)
- T410与T410i有什么区别?
- verilog源码积累:ram和axi slaver
- 哪种投影仪好用?家用电视投影仪哪种好
- 在轮询系统如何将A站订单在B站自动建立,并调用B站产品
- 2023 IAPP影视解析源码
- cordova多语言(国际化,本地化,全球化)