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)

大家都在看

  • docker部署mysql集群

    docker部署mysql集群 1.0 安装环境 1.1 安装Centos7 Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docke…

    数据库 2023年6月9日
    093
  • JSP中的EL 表达式

    JSP中的EL 表达式 什么是 EL 表达式,EL 表达式的作用? EL 表达式搜索域数据的顺序 EL 表达式输出 Bean 的普通属性,数组属性,List 集合属性,map 集合…

    数据库 2023年6月11日
    075
  • MySQL实战45讲 18

    18 | 为什么这些SQL语句逻辑相同,性能却差异巨大? 在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数…

    数据库 2023年5月24日
    097
  • 设计模式之(4)——单例模式

    定义:单例模式属于创建型模式,该类负责创建自己的对象实例,并且确保只有单个对象被创建,同时该类提供了一种全局访问其唯一实例对象的方式;这个定义中有三个要点:1、单例类只能有一个实例…

    数据库 2023年6月14日
    084
  • C语言学习笔记

    C语言学习笔记 预处理 #include include指令可以将另一个源文件的全部内容包含进来 include “stdio.h” #include 用尖…

    数据库 2023年6月14日
    0108
  • 银河麒麟V10安装MySQL8028

    记一次成功安装MySQL8028到银河麒麟V10,并实现远程访问的方法 工具/原料 数据库下载地址(实验版如图): [En] Download address of the dat…

    数据库 2023年5月24日
    092
  • day03-拉取在线用户功能

    多用户即时通讯系统03 4.编码实现02 4.2功能实现-拉取在线用户 4.2.1思路分析 客户端想要知道在线用户列表,就要向服务器发送请求(Message),因为只有服务器端保持…

    数据库 2023年6月11日
    0163
  • @Mapper报错,java.lang.NoClassDefFoundError: org/apache/ibatis/annotations/Mapper

    已解决,可以直接看末尾 @Mapper报错,如图: 查了好多资料,如:修改依赖 把1.2改成1.3后还是未能解决。 换成@MapperScan 之后项目启动报错,如图 找到解决方法…

    数据库 2023年6月11日
    094
  • ShardingSphere 异构迁移最佳实践:将3.5亿量级的顾客系统 RTO 减少60倍

    Apache ShardingSphere 助力当当 3.5 亿用户量级顾客系统重构,由 PHP+SQL Server 技术栈无缝转型为 Java+ShardingSphere+M…

    数据库 2023年5月24日
    081
  • Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制…

    数据库 2023年6月16日
    086
  • [spring]spring注解开发

    8.使用注解开发 1.bean spring4以后,注解依赖于aop包,确保你的lib中有它 确保开启了使用注解 2.组件代替bean实现自动注入 在配置文件中自动扫描包下的所有类…

    数据库 2023年6月16日
    080
  • 第16章 变量、流程控制与游标

    第16章 变量、流程控制与游标 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。 在 MySQL 数据库中,变…

    数据库 2023年6月6日
    087
  • MySQL中的全表扫描和索引树扫描

    引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况。在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就…

    数据库 2023年5月24日
    0132
  • 不要让“Clean Code”更难维护,请使用“Rule of Three”

    当人们试图将”代码整洁之道(Clean Code)”的原则应用于现有的代码库时,我经常会问这个问题。 我认为这是合情合理的。 当我们开始重构遗留代码时,通常…

    数据库 2023年6月14日
    0102
  • rsync

    rsync是什么 rsync特性 1)可以镜像保存整个目录树和文件系统。 2)可以很容易做到保持原来文件的权限、时间、软硬连接等。 3)无需特殊权限即可安装。 4)快速:第一次同步…

    数据库 2023年6月14日
    082
  • Ansible—Inventory主机清单

    含义 清查;存货清单;财产目录;主机清单 1、增加主机组 官方链接 http://docs….

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