我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入理解:Mysql执行SQL语句过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入理解:Mysql执行SQL语句过程

深入理解:Mysql执行SQL语句过程

 

开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库。数据库拿到sql语句以后。都是进行了哪些操作呢?这里向大家介绍下我的个人的理解,欢迎大家评论区批评指正。

流程概述

mysql得到sql语句后,大概流程如下:

sql的解析器:负责解析和转发sql

预处理器:对解析后的sql树进行验证

查询优化器:得到一个执行计划

查询执行引擎:得到数据结果集

将数据放回给调用端。

流程图如下所示:

深入理解:Mysql执行SQL语句过程

 

分发器及缓存阶段

首先,如果系统的缓存功能开启着的话,sql语句进入mysql后,sql进行判断,是否为select关键字。如果是,那么先去查询缓存中进行查询,如果在查询缓存中可以命中sql语句,那么直接返回查询缓存中的查询语句对应的value值(在缓存中,把查询语句做一个hash运算,结果作为key值,查询的结果集为value)。

如果命中缓存的话,查询速度是相当快的。但是查询缓存也有它相应的缺点。

首先,开启缓存的话,服务器会消耗大量的内存空间;其次,缓存有的时候并不适用;最后,有的情况下,开启缓存也不会将对应的sql语句写入缓存。

缓存不适用的情况:

缓存的锁的力度比较大,而且对于动态sql的支持度不够。

缓存在数据进行更新的时候,是进行的表级锁,更新结束后,会把所有与更新内容相关的缓存全部删除。所以,如果表的写入比较多的话,缓存是比较浪费性能的。如果写入特别多,可能缓存反而会导致mysql变慢。

查询不到缓存的情况:

查询条件有不确定数据:如now ,current_time等。

缓存对大小写敏感,如select * from test 和SELECT* FROM test 就不会解析为同一条sql

查询带来的额外开销:

开始前需要先检查缓存是否命中。

结果输出的时候,需要额外进行数据的缓存操作。

写入数据时,mysql会将对应表的所有缓存都设置为失效。当缓存内存较大的时候,会导致系统消耗较大。

sql的解析器与预处理

sql解析器是在命令分发之后,将对应的sql语句,解析为sql解析树。sql解析树是Mysql本身内部的语法规则和解析查询。验证是否使用错误的关键字,sql语法顺序是否正确等。(语法层面的错误)

解析完成后,进行查询语句预处理器,根据mysql的规则,检查解析树是否合法。(表格是否存在,别名是否有歧义等)

查询优化器

查询优化器获取到执行计划然后由查询执行引擎执行相应的操作。查询优化器,是数据库l的一个核心模块,分为cbo和rbo两种。

其中,rbo是基于规则的优化器。(rbo在oracle早期版本中使用,现在也保留,不过默认为cbo。mysql没有rbo优化器)

这些规则是硬编码在数据库的代码中的。rbo会根据输入的sql语句可以匹配到的优先级最高的规则去作为执行计划。例如:在rbo中有这么一条规则:有索引的情况下,使用索引。那么所有的带有索引的表在执行的时候,都会走索引。rbo最大的问题在于,通过固定规则来决定执行计划。并不会考虑sql中涉及的对象的数量和分布。有可能选出来的规则不是最优的执行计划。

cbo 是基于成本的优化器(基于统计信息),从目标诸多的执行路径中选择一个成本最小的执行路径来作为执行计划。成本指的是mysql根据相关的统计信息,算出来sql语句对应的io,cpu等的消耗的一个估计值。计算过程涉及到索引、表、行等数据,过程比较复杂。

查询优化器使用统计信息为sql选择执行计划。

mysql没有数据直方图,也无法手工删除统计信息。(oracle有)

在服务器曾有查询优化器,却没有保存数据和索引统计信息。统计信息由存储引擎实现,不同的存储引擎会存储不同的统计信息。

统计信息分为索引的统计信息和表的统计信息。

查看统计信息

索引统计信息

show index from table 或information_schema.statistics表

表统计信息

show table status like 或 information_schema.tables表

查询执行引擎+返回数据给客户端

得到执行计划后,根据已有的执行计划,查询执行引擎,mysql的SQL Layer层,调用Storage Engine Layer层的接口,从mysql的存储引擎中获取到相对应的结果集,然后返回给用户。

执行完成后,将结果返回给客户端,如果是查询语句,并且开启了缓存,那么,mysql会同时将结果集放到查询缓存中。然后将查到的结果集返回。如果是增删改操作,那么返回执行语句后受影响的行数。

顺便给大家推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系,主要针对Java开发人员提升自己,突破瓶颈,相信你来学习,会有提升和收获。在这个群里会有你需要的内容  朋友们请抓紧时间加入进来吧。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入理解:Mysql执行SQL语句过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入理解:Mysql执行SQL语句过程

开发人员基本都知道,我们的数据存在数据库中(目前最多的是mysql和oracle,由于作者更擅长mysql,所以这里默认数据库为mysql),服务器通过sql语句将查询数据的请求传入到mysql数据库。数据库拿到sql语句以后。都是进行了
2023-06-02

MySql中sql语句执行过程详细讲解

目录前言:sql语句的执行过程:查询缓存:分析器:优化器:执行器:总结前言:很多人都在使用mysql数据库,但是很少有人能够说出来整个sql语句的执行过程是怎样的,如果不了解执行过程的话,就很难进行sql语句的优化处理,也很难设计出来优良
2023-02-21

MySql中sql语句执行过程是什么

今天小编给大家分享一下MySql中sql语句执行过程是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。sql语句的执行过程
2023-07-05

详解MySQL 查询语句的执行过程

首先先简单的将一个查询语句背后MySQL做了什么捋一捋:客户端发送一条查询给服务器。服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划。MyS
2022-05-19

Mysql查询语句执行过程 - G

Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器)Mysql使用的是典型的C/S架构。连接器通过典型的TCP握手完成连接。需要注的是,如果用户名和密码都正确,那么该连接所拥有的权限仅仅是连接成功建立时
Mysql查询语句执行过程 - G
2021-12-15

Postgresql开启SQL执行语句收集过程

修改配置文件1.打开PostgreSQL配置文件,如:C:\Program Files\PostgreSQL\14\data\postgresql.conf2.修改如下,如果字段被#注释,则去掉#log_directowww.lsjlt
Postgresql开启SQL执行语句收集过程
2024-10-14

MyBatis的SQL语句执行过程是什么

这篇文章主要介绍“MyBatis的SQL语句执行过程是什么”,在日常操作中,相信很多人在MyBatis的SQL语句执行过程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyBatis的SQL语句执行过程
2023-06-30

编程热搜

目录