(一)大白话MySQL执行SQL的流程

(一)大白话MySQL执行SQL的流程

(二)大白话InnoDB存储引擎的架构设计

(三)大白话MySQL Binlog是什么?

(四)大白话MySQL的Buffer Pool内存结构

(五)大白话MySQL的Buffer Pool的free链表、flush链表、LRU链表

(六)大白话MySQL是如何基于冷热数据分离的方案,来优化LRU算法?

(七)大白话MySQL是如何将LRU链表的使用性能优化到极致的?

无论在工作还是面试中,MySQL都是所有后端程序员必须熟练掌握的技术。而目前MySQL却是大多数程序员进阶过程中的一个短板,编码十几年可能只会个增删改查,了解一些mysq的语法,对mysql的底层没有一个系统的了解,究其原因,主要有以下几点:

  1. 网上大多资料文章都留于理论,缺乏实战
  2. mysql底层讲解过于晦涩难懂,看的头痛
  3. 无法解决生产或面试中遇到的mysql优化问题

本人正好从事过MYSQL运维十几年,所以本专栏从零开始、一步一图,全部使用大白话,即使0基础的小白也看得懂得语言,系统全面的讲解mysql底层实现、mysql如何通过优化获取最佳行呢,只要坚持学完本专栏,您也能成为MySQL实战优化高手!

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语句进行一下拆解,可以拆解为以下几部分:

  1. 要从『users』表里查询数据
  2. 查询『id』字段等于1的那行数据
  3. 对查询出来的那行数据要提取里面『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的执行流程:

  1. 用户发起请求到tomcat服务器,tomcat服务器中线程开始执行sql 语句
  2. 首先线程从数据库的连接池中获取一个连接,建立与MySQL数据库服务器的连接
  3. MySQL的工作线程接收到SQL语句后,转交给SQL接口去执行
  4. 查询解析器对SQL进行语法拆解,理解这个SQL要干什么
  5. 查询优化器选择最优的查询路径,生成SQL的执行顺序和步骤
  6. 执行器将sql执行计划交给底层的存储引擎接口去执行,他按照一定的步骤去查询内存数据、更新磁盘数据等等

执行过程如下图所示:
在这里插入图片描述
好了,本章节到此为止,先大概整体了解一下MySQL的整体架构和各个组件,后面章节会更详细介绍各个组件的作用和底层原理。

100、创作不易,更多大白话章节,请订阅本专栏,谢谢支持!

IT社团出品,必属精品!本专栏有100+章节,哪怕你是一个MySQL小白,只要坚持学完本专栏,也能成为MySQL实战优化高手!

在这里插入图片描述
部分目录如下:
在这里插入图片描述

  • 122
    点赞
  • 457
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
运行 MySQLSQL 语句主要分为三个步骤:词法分析、语法分析和优化器处理。在词法分析阶段,要提取关键字、表名、字段名和查询条件等信息。在语法分析阶段,判断输入的 SQL 是否正确,是否符合 MySQL 的语法规则。最后,在优化器处理阶段,MySQL 会根据分析器的结果进行优化,以提高执行效率。 此外,为了减少数据库的连接操作,可以尽量使用长连接。但是长时间使用长连接可能导致 MySQL 占用的内存越来越大,甚至可能出现OOM(内存溢出)情况,从而导致 MySQL 异常重启。 当需要创建临时数据表时,可以使用以下 SQL 语句: CREATE TABLE 临时数据表 SELECT 字段1, ..., 字段N FROM 数据表 GROUP BY (字段1, ..., 字段N)。 总结起来,MySQL 运行 SQL 语句的步骤包括词法分析、语法分析和优化器处理。同时要考虑数据库的连接操作和内存占用情况。在创建临时数据表时,可以使用 CREATE TABLE ... SELECT ... 的语法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SQL语句在MySQL中是如何执行的](https://blog.csdn.net/liuerchong/article/details/120985394)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [MySQL数据库sql语句的执行](https://blog.csdn.net/nicergj/article/details/83338302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值