Mysql 执行流程

1、逻辑剖析

sql 执行流程为:sql语句 -> 查询缓存 -> 解析器 -> 优化器 -> 执行器。

1.1 服务器处理客户端请求

​ 客户端程序 connectors >> 连接池 >> SQL接口 >> 解析器 >> 优化器 >> 查询缓存 >> 插件式存储引擎 >> File(文件系统/日志文件)

1. 客户端程序 : 包括一些mysql工具如:native 或者语言工具如:php 、go 、python
2. 连接池  : 提供多个用户客户端和服务端交互的线程
3. SQL接口 : 接收sql命令,返回查询结果
4. 解析器  : 进行sql语法的解析、语意解析、生成语法树
5. 优化器  : mysql核心组件,对sql命令进行优化
6. 缓存    : 以key -> value方式缓存查询结果 (如果查询sql指令有缓存直接在SQL接口部分返回缓存结果)
7. 存储引擎 : 与底层文件惊醒交互,查询数据文件系统、日志文件等

Mysql 执行流程

1.2 Connertors

connectors 是指在不同语言中与sql的交互。 要使用mysql 可以编写程序与mysql服务端建立tcp连接 按照定义好的mysql协议进行交互。

接下来的mysql server结构分为如下三层。

1.3 连接层

客户端访问mysql服务端前,需要建立tcp连接

经过三次握手连接成功后,mysql服务端对tcp传输的账号密码进行认证、权限获取(通过权限表获取权限写入内存)。

由于多个系统与mysql建立的连接并不止一个,所以为了解决tcp无限创建销毁TCP连接带来的资源消耗、性能下降问题。mysql服务器有专门的tcp连接池限制最大连接数,采用长连接模式复用tcp连接,来解决以上问题

1.4 服务层

服务层主要完成大多数的核心服务功能,如SQL接口,缓存查询、SQL分析以及优化部分内置函数的执行,所有的跨存储引擎功能也在这一层实现,如:存储过程、存储函数。

在这一层,服务器解析查询并创建相应的解析树,并对其进行优化,如确定表查询的顺序、是否使用索引等,最后生成相应的执行操作。

[En]

In this layer, the server parses the query and creates the corresponding parsing tree, optimizes it, such as determining the order of the table query, whether to use the index, etc., and finally generates the corresponding execution operation.

如果是查询SELECT语句 ,服务会查询内部缓存,如果缓存空间足够大,可以解决大量读操作的环境中很好的提升系统的性能。

  • SQL Interface 接口
  • 接收sql命令,返回查询结果
  • 支持DML、DDl、存储过程、视图、触发器、自定义函数等多种SQL语言接口
  • Parser:解析器
  • 进行sql语法的解析、语意解析、将sql分解成数据结构
  • sql指令传递到解析器的时候被解析器验证和解析,生成一个语法树,创建好之后还会对sql查询进行语法上的优化,进行查询重写。
  • 查询优化器
  • sql命令在解析之后、查询之前会使用查询优化器确定sql语句的执行路径,生成一个执行计划
  • 这个执行计划表明应该使用哪些索引进行查询,表之间的顺序应该如何,最后按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将结果返回
  • 他使用 选取-投影-连接策略查询,如:
select id,name from user where gender='女'

这个sql查询先根据where进行 选取,而不是将数据全部查询出来在进行过滤。 这个sql先根据id和name进行属性 投影,而不是将所有字段取出来在过滤 将两个条件 连接起来生成最后的结果
* 查询缓存组件( mysql8.0 已经优化掉该过程 )
– mysql内部维持着一些cache和buffer,比如query cache用来缓存一条select语句的结果。如果能在查询中找到对应的缓存,则不必在执行解析优化的过程直接返回缓存结果。
– 缓存机制由一系列小缓存组成。如:表缓存、记录缓存、key缓存、权限缓存,并且可以在不同客户端之间共享
– 从5.7.2之后不推荐使用查询缓存。 在mysql8.0中删除该机制

1.5 引擎层

mysql的架构可以在不同场景中应用并发挥良好的作用,主要体现在存储引擎上,插件式的引擎架构将查询处理和其他系统任务以及数据的存储提取分离。这种架构可以根据业务去求和实际需要选择合适的存储引擎,同时开源的mysql还允许开发人员设置自己的开发引擎。

插件式的存储引擎层,真正的负责了mysql中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过api与存储引擎通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

1.6 存储层

所有的数据、数据库、表的定义,表的数据、索引等都是存储在文件系统上以文件的形式存在,并且完成存储引擎的交互,在文件系统下,可以使用本地磁盘,也可以使用DAS、NAS、SAN等各种存储系统。

2、SQL执行流程

2.1 mysql中的sql执行流程图

Mysql 执行流程

Mysql中的查询流程:

  1. 查询缓存: Server如果在缓存中发现了sql语句,则直接返回 如果没有就进入解析器阶段。需要说明的是因为查询缓存往往效率不高,所以8.0就抛弃了这个功能。 ​ 一般建议在静态表里使用查询缓存,静态表就是极少更新的表,比如系统的配置表、字典表。好在mysql 提供了按需使用的方式,可以将my.cnf参数query_cache_type设置成DEMAND,代表sql语句中有sql_cache关键词时才缓存如:
#quert_cache_type 0表示关闭查询缓存OFF。1表示开启查询缓存ON.  2 表示 DEMAND
query_cache_type=2
#对于你确定要使用查询缓存的语句时可以用SQL_CACHE显式指定:
SELECT SQL_CACHE * FROM test where id = 1

​ 在 5.7中查看是否开启查询缓存:

show variables like '%query_cache_type%'

​ 监控查询缓存的命中率:

show status like '%Qcache%';

Mysql 执行流程
  1. 解析器:介于sql语句的语法分享、语义分析

Mysql 执行流程
  1. 优化器: 在优化器中会确定sql语句的执行路径,比如是根据全表检索 还是根据索引检索等 ​ 在查询优化器中,分为逻辑查询优化和物理查询优化两个大块
  2. 物理查询优化是通过索引和表连接方式等技术进行优化
  3. 逻辑查询优化是通过sql等价变换提升查询效率,直白点说就是换一种执行效率高的写法。 截止到现在,还没有真正的读表,而是产出了一个执行计划。于是进入到 执行器阶段
  4. 执行器:
    通过上述阶段生成的执行计划进行操作。您需要在执行之前确定该用户是否有权限。如果没有,则返回权限错误,如果有权限,则执行并返回结果。
    [En]

    Operate through the execution plan generated by the above phase. You need to determine whether the user has permissions before execution. If not, a permission error is returned, and if the permission is available, it will be executed and the result will be returned.

    执行器会根据表的引擎定义,调用存储引擎API对表进行读写。存储引擎Api只是抽象接口,下面还有一层存储引擎层,具体实现还要看表选择的存储引擎。

总结

至此sql语句在mysql中就执行完了。对于有索引的表,执行的逻辑也差不多。

Mysql 执行流程

2.2 mysql中的sql执行原理

​ 前面的结构很复杂,我们只需要抓去最核心的部分:sql执行原理。 不同的dbms的sql执行原理相同,在不同的软件中,各有各的实现路径

​ 在不同的模块中,sql执行所使用的资源是怎么样的,如何对一条sql语句的执行时间进行分析:

  1. 确认 profiling值 ​ 了解查询语句底层执行的过程: SELECT @@profiling; 或者 SHOW variables like '%profiling%'; ​ 查看是否开启了计划,开启这个值可以让mysql收集在sql语句执行时所使用的资源情况,命令如下:
SELECT @@profiling;
#或
SHOW variables like '%profiling%';

#profiling  0代表关闭 1代表开启
set profiling = 1;

#查看执行语句的资源情况
SHOW PROFILES
或
SHOW PROFILE FOR QUERY 157  #SHOW PROFILES 中的id值

Original: https://www.cnblogs.com/Kuju/p/16173927.html
Author: 酷酷的sinan
Title: Mysql 执行流程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505464/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaWeb核心篇(5)——Filter和Listener

    JavaWeb核心篇(5)——Filter和Listener JavaWeb具有三大组件:Servlet,Filter,Listener 在之前的文章中,我们已经学习了Servle…

    数据库 2023年6月14日
    096
  • SQL语言的总结

    SQL语言分类:1.数据查询语言(DQL:Data Query Language),也称为”数据检索语句”,用以从表中查询获得数据,常用关键字SELECT …

    数据库 2023年6月16日
    091
  • 用户管理

    介绍Linux用户组的概念和对用户添加,删除和指定密码的基本操作 用户管理 Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一…

    数据库 2023年6月16日
    0126
  • JMeter接口自动化发包与示例

    JMeter接口自动化发包与示例 近期需要完成对于接口的测试,于是了解并简单做了个测试示例,看了看这款江湖上声名远播的强大的软件-Jmeter靠不靠谱。官网:https://jme…

    数据库 2023年6月6日
    063
  • 二分查找及其应用

    概述 二分查找算法是一种效率极高的算法,也是为数不多时间复杂度在 O(logn)量级的算法。算法思想并不难理解,但是某些细节却十分复杂,…

    数据库 2023年6月11日
    065
  • 工具 | 常用 MySQL 内核 Debug 技巧

    作者:柯煜昌 顾问软件工程师目前从事 RadonDB MySQL 容器化研发,华中科技大学研究生毕业,有多年的数据库内核开发经验。 掌握 MySQL 内核源码的阅读和调试能力,不仅…

    数据库 2023年5月24日
    0112
  • springboot~ApplicationContextAware与@Autowired注解

    ApplicationContextAware是一个接口,它提供一个方法setApplicationContext,当spring注册完成之后,会把ApplicationConte…

    数据库 2023年6月6日
    082
  • python-django框架中使用七牛云

    1:注册七牛云账号 https://www.qiniu.com/ js文件 链接:https://pan.baidu.com/s/1BW1svHqEsXrrTNtRobKkpg 提…

    数据库 2023年6月6日
    098
  • MySQL实战45讲 1,2

    01 | 基础架构:一条SQL查询语句是如何执行的? Server 层 所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模…

    数据库 2023年6月16日
    072
  • mysql 事务 隔离性 锁

    1、四大特性 1.1 原子性(Atomicity) 事务是一个不可分割的最小工作单元。事务是一个不可分割的最小工作单元。 [En] A transaction is an indi…

    数据库 2023年5月24日
    075
  • element-ui el-table 悬停/选中 行样式,鼠标样式

    /* 用来设置当前页&am…

    数据库 2023年6月16日
    081
  • 创建一个属于自己的linux系统Docker镜像之旅-简单模式

    在创建容器之前首先要把该开启的服务都启动 1.CentOS的虚拟机/服务器 2.Docker 服务开启 systemctl start docker 文件的创建,可以在root下直…

    数据库 2023年6月6日
    082
  • 【黄啊码】MySQL入门—4、掌握这些数据筛选技能比你学python还有用-1

    大家好!我是黄啊码,今天没继续select * 了吧,如果还继续,那接下来的课程先别学,回去好好把之前的课程重复复习一遍,学明白了我们再会?废话不多说,学今天的课程之前我们先来说说…

    数据库 2023年6月16日
    076
  • mysql语法使用详细代码版

    mysql 1.什么是数据库 数据库:(DB,DataBase)作用:用来存储数据,管理数据。Txt,Excel,word是在数据库出现之前存储数据的。概念:数据仓库,安装在操作系…

    数据库 2023年5月24日
    080
  • 2022-8-18 第六组 JDBC

    JDBC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有…

    数据库 2023年6月14日
    082
  • Vue3提高效率小技巧

    问题1:Vue3使用了setup API,无法访问到this,虽然提供了getCurrentInstance API,但访问全局变量时感觉比Vue2使用方式更繁琐了,因此想了个捷径…

    数据库 2023年6月11日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球