(一)大白话MySQL执行SQL的流程
(一)大白话MySQL执行SQL的流程
(二)大白话InnoDB存储引擎的架构设计
(三)大白话MySQL Binlog是什么?
(四)MySQL的Buffer Pool内存结构
(五)MySQL的Buffer Pool的free链表、flush链表、LRU链表
(六)MySQL是如何基于冷热数据分离的方案,来优化LRU算法?
(七)MySQL是如何将LRU链表的使用性能优化到极致的?
文章目录
- 1、通常sql执行流程
- 1.1 问题1:MySQL谁去处理网络请求?
- 1.2 问题2:MySQL如何执行sql语句?
- 1.3 查询解析器
- 1.4 查询优化器
- 1.5 存储引擎
- 1.6 执行器
- 1.7 总结
1、通常sql执行流程
- 上图为用户正常请求网页时,正常的sql执行的流程,比如执行如下sql:
select id,name,age from users where id=1
- 用户发起请求到业务服务器,执行sql语句时,先到连接池中获取连接,然后到mysql服务器执行查询。
- 接着我们带着下面几个问题来认识下mysql内部的几个重要组件。
1.1 问题1:MySQL谁去处理网络请求?
msyql服务器谁负责从这个连接中去监听这个网络请求?谁负责从网络连接里把数据读出来?
- 其实大家都知道,网络连接必须得分配一个线程去处理,由一个线程来监听和读取请求数据,那么mysql服务器也是启动一个线程从网络连接中读取和解析出来一条发过去的sql语句,如下图所示:
1.2 问题2:MySQL如何执行sql语句?
- 接着我们思考一下,当mysql内部的工作线程从一个网络连接中读取出来一个sql语句之后,此时会如何执行这个sql语句呢?
- 如果要执行这个sql,去完成底层的数据增删改查,其实是一项极其复杂的任务了。Mysql内部首先提供一个组件,就是SQL接口(SQL Interface),他是一套执行sql语句的接口,专门用于执行我们发送给mysql的那些增删改查的sql语句。
- 因此mysql工作线程接收到SQL语句后,就会转交给SQL接口去执行,如下图:
1.3 查询解析器
MySQL怎么看懂和理解这些SQL?比如现在有个这样的SQL,我们人脑处理一下,只要懂SQL语法的人,立马就明白什么意思了。但是MySQL是一个数据库管理系统,他是没法直接理解这些SQL语句的!此时就有一个关键组件出场了:查询解析器。
查询解析器(Parser)是负责对SQL语句进行解析的,比如上面那个sql语句进行一下拆解,可以拆解为以下几部分:
- 要从『users』表里查询数据
- 查询『id』字段等于1的那行数据
- 对查询出来的那行数据要提取里面『id,name,age』三个字段
所谓的SQL解析,就是按照既定的sql语法,对我们按照sql语法规则编写的sql语句进行解析,然后理解这个sql语句要干什么事情,如下图所示:
1.4 查询优化器
当通过解析器理解了SQL要干什么之后,并不是马上去执行,而是要通过查询优化器(Optimizer)来选择一个最优的查询路径。就以上面那个sql查询为例,看下所谓最优查询路径是什么。
要完成这个事,我们有以下几个查询路径:
- 查询路径1:直接定位到『users』表中的『ID』字段等于1的那一行数据,然后取那行数据的『id,name,age』三个字段值就行了;
- 查询路径2:先把『users』表中每一行数据的『id,name,age』三个字段的值都查出来,然后从这批数据里过了出『id』字段等于1的那行数据。
上面就是一个最简单的SQL语句的两种实现路径,要完成这个sql语句的目标,两个路径都可以做到,但哪一种更好呢?显然感觉上第一种查询路径更好一些。
所以查询优化器就是针对你编写的几十行、几百行甚至上千行的复杂sql语句生成查询路径树,然后从里面选择一条最优的查询路径出来。相当于他告诉sql执行器,按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步把SQL语句就完成了。
1.5 存储引擎
数据库就是一个编程语言写出来的系统而已,然后启动之后也是个进程,执行池里面的各种代码,也就是我们上面所说的那些东西。所以对数据库而言,我们的数据要不然是放在内存里,要不然是放在磁盘文件里,没什么特殊的地方!所以我们来思考一下,假设我们的数据有的存放在内存里,有的存放在磁盘文件里如下图所示。
那么问题来了,我们执行的时候是先更新内存数据?还是磁盘数据?我们如果先更新磁盘数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?
这个时候就需要存储引擎了。存储引擎其实就是执行sql语句的,它会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据等等,执行一系列数据的操作,如下图所示:
MySQL的架构设计中,SQL接口、SQL解析器、查询优化器都是用的一套组件。但是存储引擎像插件一样,支持各种各样的存储引擎的,比如我们常见的InnoDB、MylSam、Momery等。我们可以自由选择哪种存储引擎来负责具体的SQL执行。不过现在大家一般都使用InnoDB作为MySQL的存储引擎。
1.6 执行器
那么看完存储引擎之后,我们知道存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么是谁来调用存储引擎的接口呢?其实我们现在还漏了一个执行器的概念,这个执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。
举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“usrs”表中的第一行数据,然后判断一下这个数据的"id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。
就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来。如下图所示:
1.7 总结
我们再来总结下MySQL的执行流程:
- 用户发起请求到tomcat服务器,tomcat服务器中线程开始执行sql 语句
- 首先线程从数据库的连接池中获取一个连接,建立与MySQL数据库服务器的连接
- MySQL的工作线程接收到SQL语句后,转交给SQL接口去执行
- 查询解析器对SQL进行语法拆解,理解这个SQL要干什么
- 查询优化器选择最优的查询路径,生成SQL的执行顺序和步骤
- 执行器将sql执行计划交给底层的存储引擎接口去执行,他按照一定的步骤去查询内存数据、更新磁盘数据等等
执行过程如下图所示:
好了,本章节到此为止,先大概整体了解一下MySQL的整体架构和各个组件,后面章节会更详细介绍各个组件的作用和实现方法。
章节目录:
(一)大白话MySQL执行SQL的流程
(二)大白话InnoDB存储引擎的架构设计
(三)大白话MySQL Binlog是什么?
(一)大白话MySQL执行SQL的流程相关推荐
- mysql执行sql语句按钮_mysql执行sql语句过程
开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库 ...
- PHP获取MySQL执行sql语句的查询时间
PHP获取MySQL执行sql语句的查询时间 1. $t1=microtime(true); mysql_query($sql); echo microtime(true)-$t1; 2. //计时开 ...
- 怎么提高Mysql执行sql导入的速度
怎么提高Mysql执行sql导入的速度 1.如果mysql的data数据很少,内存足够大,可以把data防止到内存盘中. linux如下设置内存盘: mount -t ramfs none /ram ...
- Linux中连接mysql执行sql文件
Linux中连接mysql执行sql文件 数据量小的时候可以把sql语句内容粘贴执行,但是文件很大的时候,这样执行效率很慢很慢,需要使用source执行sql文件 1.客户端连接mysql数据库 [r ...
- navicat for mysql执行sql语句报错: [Err] 1146 - Table ‘performance_schema.session_status‘doesn‘t exist 解决办法
navicat for mysql执行sql语句报错: [Err] 1146 - Table 'performance_schema.session_status' doesn't exist 解决办 ...
- oracle与mysql执行sql原理_PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式
PostgreSQL.Oracle/MySQL和SQL Server的MVCC实现原理方式 关系数据库管理系统使用MVCC(Multiversion Concurrency Control多版本并发控 ...
- python 调用mysql_Python中直接在MySQL执行SQL命令
因为懒,所以不想用SQLyog,用Python写了一个快速执行SQL命令的程序:import pymysql,sys class dealMySQL(object): 'PyMysql' versio ...
- MYSQL执行sql时报错:Table 'performance_schema.session_status' doesn't exist解决办法
1.今天,在本地mysql底下执行sql时报错了,报错信息是Table 'performance_schema.session_status' doesn't exist,百度了一下说解决办法是进入m ...
- php查看mysql最近执行过的sql_PHP获取MySQL执行sql语句的查询时间
//计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...
最新文章
- 41. Leetcode 662. 二叉树最大宽度 (二叉树-二叉树性质)
- C++中的内存管理(new、delete、内存泄漏)
- Spring Security——集成Spring Session、Redis和JSON序列化解决方案
- 如何为Apache JMeter开发插件(一)
- numpy统计分布显示
- gcc和g++有什么区别?
- 对于移动类型Z17和帐户64020100 物料号 (009)的不同的字段选择(公司间调拨)
- BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现
- 获取网关IP和MAC 的VB源码
- 拓端tecdat|R语言中不同类型的聚类方法比较
- 欢迎进入测试day01作业
- CSDN博客添加使用百度统计
- (一)外显子组数据分析之软件安装大全
- 新西兰的中国新移民现状:缺乏安全感和归属感
- 电脑可以上网但网络显示感叹号无Internet的解决办法
- c#程序设计实训报告心得体会_关于实训的心得体会4篇
- 新媒体短视频运营哪些内容
- 魅族手机没有插耳机却显示耳机模式解决方案
- 编译安装redis6.2.6
- 关于微信小程序云开发以及云开发实例展示
热门文章
- jupyter notebook 运行不出结果,没报错,不是[*]或者[ ]
- 安卓单元测试全攻略,让代码测试一劳永逸
- 统计代码php,求简易php流量统计代码?
- 西门子SCL语言编写随机数
- linux安装 openbabel pybel
- 格式化的计算机数据就找不回来了,电脑被格式化了,硬盘文件恢复的回来吗?...
- 九个好习惯让你轻松理财
- python-GIL、死锁递归锁及线程补充
- matlab 期权图,期权定价matlab程序.docx
- 芯片DDR调试常见问题