01 | 基础架构:一条SQL查询语句是如何执行的?

这篇具有很好参考价值的文章主要介绍了01 | 基础架构:一条SQL查询语句是如何执行的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FAQ

画出 MySQL 的基本架构图

image.png

Server 层和存储引擎层各自有哪些组件?

Server 层

  • 连接器
  • 查询缓存
  • 分析器
  • 优化器
  • 执行器
  • 所有内置函数(日期、时间、数学和加密函数等)
  • 所有跨存储引擎的功能(存储过程、触发器、视图等)

存储引擎层

  • 负责数据的存储和读取

连接器的作用?

  • 连接器负责跟客户端建立连接、获取权限、维持和管理连接
  • 获取权限:连接器从权限表中获取用户所拥有的权限,
    • 如果是全局权限,则将权限信息加载到内存 acl_users 数组中,并且将权限信息拷贝一份到线程对象中,连接中的权限判断以线程对象中保存的权限信息作为依据,因此全局权限的 grant/revoke 只对新建连接生效,对已存在的连接不生效。
    • 如果是库级别权限,则将数据表的权限信息加载到内存 acl_dbs 数组中,之后,权限判断逻辑以内存 acl_dbs 数组中的权限信息作为依据,不过存在一种特殊情况,使用 use db 命令时,会将数组 acl_dbs 中的用户权限信息拷贝一份保存到会话变量中,之后,在该会话中的权限检验以该会话变量中保存的用户权限为准。
    • 如果是表、列权限,则将权限信息加载到 column_priv_hash 哈希结构中,之后权限判断,以该哈希结构中存储的数据为准,对已建立的连接立刻生效。
权限范围 存储权限信息的数据表 存储权限信息的内存数据结构 grant/revoke 语句对数据表和内存权限信息的影响 特殊逻辑 grant/revoke对已建立连接的影响 对新建立连接的影响
全局权限 mysql.user acl_users 每次 grant/revoke 时,不仅修改数据表,也会同步修改内存 acl_users 数组 mysql 会为连接维护一个线程对象,并将内存 acl_users 数组中的用户权限信息拷贝到线程对象中,在此之后,此连接中的所有全局权限的判断,直接使用线程对象中保存的权限位 不影响已建立连接 立刻生效
库级别权限 mysql.db acl_dbs 每次 grant/revoke 时,不仅修改数据表,也会同步修改内存 acl_dbs 数组 use db 语句会将获取到的库权限信息保存在会话变量中,在此之后,此连接中的所有库权限的判断,都直接使用该会话变量中保存的权限位
- 不影响执行过 use db 命令的已建立连接
- 对未指定库的连接,立即生效
立刻生效
表和列权限 mysql.tables_priv, mysql.columns_priv column_priv_hash 每次 grant/revoke 时,不仅修改数据表,也会同步修改内存 column_priv_hash 结构 立刻生效 立刻生效
  • 针对表级别的权限修改,无论连接是新建的还是后来创建的,命令立马生效,
  • 针对全局权限或者库级别权限的修改,已有的连接不受影响(特殊情况:库级别权限修改并且使用 use db 命令,一般程序都会使用该命令),后续新建的连接才会生效。

什么是长连接、短连接?

如果客户端使用了连接池,则客户端和RDS实例之间的连接为长连接(建立连接并读写完成后不会主动断开的连接),反之则为短连接(建立连接并读写完成后主动断开的连接)。

使用长连接,为什么有时可能会导致 MySQL 占用内存涨得特别快,从而导致内存占用太大,被系统强行杀掉(OOM)

因为 MySQL 在执行过程中临时使用的内存是在连接对象里进行管理的。而在默认情况下,连接对象中申请的资源会在连接断开时才会释放(释放给了系统还是 MySQL?)。因此如果长连接长时间不断开连接,可能导致 MySQL 内存占用太大,从而被系统强行杀掉(OOM)

如何解决长连接长时间不断开,导致连接内存占用太大,进而导致 MySQL 内存占用太大,从而被系统强行杀掉?

两种方案

  1. 定期断开长连接。使用一段时间,或者在程序里判断执行过一个占用内存的大查询后,断开连接,之后查询再重建连接
  2. 在 MySQL 5.7 或更新版本,每次执行完一个占用内存较大的操作后,执行 [mysql_reset_connection](https://www.yuque.com/docs/share/7ff2ccda-65c6-4dcb-b93c-f7d08f7fecd7?# 《cmd_reset_connection》) 来重新初始化连接资源。并且不需要重连和重新校验权限,但会将连接恢复到刚刚创建完成时的状态
    1. C API:mysql_reset_connection
    2. Python API:cmd_reset_connection(无法重新初始化连接资源,释放不了所占用的内存,只能重置用户和系统变量)

[wait_timeout and interactive_timeout 参数的区别和联系](https://www.yuque.com/docs/share/26d83ed1-bcff-4211-a315-1c32b2745a1e?# 《wait_timeout and interactive_timeout 参数的区别和联系》)

为什么叫交互式和非交互式连接?通俗解释不知道?

  • 交互式连接:通过 mysql 客户端 与 mysql server 建立的连接是交互式连接
  • 非交互式连接:不是通过 mysql 客户端,而是通过 jdbc 等方法与 mysql server 建立的连接称为非交互式连接

会话级变量 wait_timeout

参数 作用
wait_timeout 非交互式连接建立完成后,使用过程中的等待时间(单位:秒)
interactive_timeout 交互式连接建立完成后,使用过程中的等待时间(单位:秒)
  1. 交互式连接的会话变量 wait_timeout 和 interactive_timeout 都继承自全局变量 interactive_timeout
  2. 非交互式连接的会话变量 wait_timeout 和 interactive_timeout 分别继承自全局变量 wait_timeout 和 interactive_timeout
  3. 无论是交互式还是非交互式连接,连接闲置阈值都由会话变量 wait_timeout 控制,与会话变量 interactive_timeout 无关。

查询缓存中存储的是什么内容?

查询缓存中存储着执行过的语句和其结果,并以 key-value 的形式存储在内存中,其中 key 对应查询的语句,value 对应查询的结果。当查询语句能够在查询缓存中匹配到的话,则直接返回查询结果。

为什么不建议使用查询缓存?

查询缓存的失效机制:只要表上有一个更新,那么查询缓存中关于这张表的所有查询缓存都将清空,这对于更新频繁的数据库来说,查询缓存的命中率会非常低,因此查询缓存基本没用

分析器的作用?

解析 SQL 语句,以获悉该 SQL 语句要做什么。

分析器中词法解析的作用?

SQL 语句由多个字符串和空格、换行组成,词法解析会将 SQL 中的字符串识别出来,并确定每个字符串代表的含义(表、字段、关键字等)
比如,查询语句 select id from t where id = 10,词法解析会将字符串 ”t“ 识别为”表名 t“,字符串 ”id“ 识别为“列 id”

分析器中语法解析的作用?

语法解析器根据语法规则判断 SQL 语句是否满足 MySQL 语法

优化器的作用?

  • 优化器在表中有多个索引时,决定使用哪个索引
  • 或者在一个语句有多表关联时,决定各个表的连接顺序

执行器的作用?

调用存储引擎提供的接口去读写数据文章来源地址https://www.toymoban.com/news/detail-475742.html

执行器执行查询前,需要判断是否有查询语句中相关表的查询权限,为什么不将这个权限校验的过程放到优化器或分析器中去做?

  • 连接阶段只是“获得权限信息”, 真正开始查询动作,才判断“有没有操作这个表的权限”
  • 连接阶段是去系统表读数据,结果放在变量,执行器使用这个变量

到了这里,关于01 | 基础架构:一条SQL查询语句是如何执行的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 一条SQL语句是如何执行的?

    ​ 所以今天我们把MySQL拆解一下,看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说,MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数

    2024年02月01日
    浏览(41)
  • 从Mysql架构看一条查询sql的执行过程

    我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接。 首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。 第一个就是通信协议,比如我们是用HTTP还是WebService还是TCP? 第二个是消

    2024年02月08日
    浏览(33)
  • 一条SQL如何被MySQL架构中的各个组件操作执行的?

    简单用一张图说明下, MySQL 架构有哪些组件,接下来给大家用 SQL 语句分析 假如 SQL 语句是这样 SELECT class_no FROM student WHERE name = \\\'lcy\\\' AND age 18 GROUP BY class_no 其中 name 为索引,我们按照 时间顺序 来分析一下 客户端:客户端(如 MySQL 命令行工具、 Navicat 、 MySQL Workbench 或其他应

    2023年04月22日
    浏览(34)
  • MySQL面试题:一条SQL语句在MySQL中执行过程全解析

    介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图。 连接/线程处理(连接器): 身份认证和权限相关(如连接处理、授权认证、安全等等)。 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除)。 解析器: 没有命中缓存的话,SQL 语句就会经过解析

    2024年02月03日
    浏览(31)
  • myql进阶-一条查询sql在mysql的执行过程

    目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 假设我们执行一条sql语句如下: 首先我们会和mysql建立连接,此时就会执行到连接器。 连接器的职责是负责和客户端建立连接、获取权限、维持和管理连接。 我们执行sql之前首先要和数据库建立

    2024年01月21日
    浏览(41)
  • 如何进行MySQL源码调试(一条select语句的执行流程)

    一、背景 MySQL是当今世上最受欢迎的使用最广泛的开源数据库,它的繁荣离不开它的开源特性。放在过去商业数据库的时代,大家都没有机会接触到数据库的源代码,但在如今开源数据库的时代,越来越多的人开始研究数据库的源码,并给社区贡献代码,MySQL官方每次发布新

    2024年02月03日
    浏览(34)
  • GaussDB SQL查询语句执行过程解析

    本文分享自华为云社区《【GaussTech第2期】GaussDB SQL查询语句执行过程解析》,作者: GaussDB 数据库。 SQL于关系型数据库而言,重要性不言而喻。就像一个乐团的指挥,指导着作品的正确演绎和节奏的和谐统一。华为云GaussDB作为新一代关系型分布式数据库,具备卓越的技术性

    2024年04月24日
    浏览(28)
  • SQL-分页查询and语句执行顺序

     🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页: 小小恶斯法克的博客 🎈该系列文章专栏: 重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏 📜 感谢大家的关注! ❤️ 目录  DQL-分页查询 案例

    2024年01月22日
    浏览(42)
  • 一条SQL在MySQL中是如何执行的

    MySQL的内部组件结构 连接数据库做了什么? 建立链接的时候需要将host,user,pwd,在user表中校验用户(用户名和密码)是否正确。每个链接链接到服务器端之后会给链接开辟一个专属的空间。这个空间存储了很多这个链接需要使用的操作。并且会把这个用户的权限都放到这个空间

    2023年04月09日
    浏览(29)
  • MySQL中,SQL 查询总是先执行SELECT语句吗?

    在使用 MySQL 进行查询时,我们通常会使用 SELECT 语句,但是 SELECT 语句是否总是最先被执行呢?这是一个非常有趣的问题,本文将对此进行探讨。 在 MySQL 中,SQL 查询通常包括以下几个步骤: 语法解析 :MySQL 会对 SQL 查询语句进行语法解析,检查语句是否符合 SQL 语法规范。

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包