【MySQL系列】- Select查询SQL执行过程详解

这篇具有很好参考价值的文章主要介绍了【MySQL系列】- Select查询SQL执行过程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【MySQL系列】- Select查询SQL执行过程详解

一、SQL查询语句的执行过程

【MySQL系列】- Select查询SQL执行过程详解,Mysql,mysql,sql,数据库

二、SQL执行过程详解

一条SQL语句从发送到数据并返回结果,主要经历以下几个过程:

  1. 连接器
  2. 查询缓存:如果开启了查询缓存,则会经过这一步,但是大多数情况下都不是开启的,也不建议开启;MySQL8.0之后也删除了这一块功能。
  3. 分析器
  4. 优化器
  5. 执行器

2.1. 连接器

如果想对MySQL进行操作,第一步建立数据库连接,这个过程就是连接器来完成的,它主要负责与客户端的通信,验证用户名和密码是否正确等。大多数的应用系统会在第一次启动的时候建立好一定数量的数据库连接池,这个就是通过连接器与数据库提前建立好连接。

2.2. 查询缓存

开启了查询缓存,在select查询语句过来的时候会先到查询缓存看之前是不是执行过这条语句,查询缓存存储的数据是以键值对的形式进行存储(类似与Map),key就是查询的SQL语句,VALUE是查询的结果。由于查询缓存这一块那么重要而且MySQL8.0之后也删除了。

2.3. 分析器

对客户端传过来的SQL进行分析,包括预处理与解析过程,并进行关键词的提取、解析,并组成一个解析树。主要提取如/update/delete/or/in/where/group by/having/count/limit等这个的关键词。

select * from user where id=1

例如这样的一条语句,在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,将用户的匹配字段和自定义语句识别出来,这个阶段也会做一些校验,比如效验user表是否存在,表中是否有id字段等。

2.4. 优化器

经过前面的步骤,数据库已经知道SQL可以执行了,接下来优化器会根据执行计划选择最优的选择,匹配合适的索引,选择最佳的方案。

2.5. 执行器

执行器会调用对应的存储引擎执行 sql。主流的存储引擎是MyISAM 和 Innodb。

三、undo log 和 redo log作⽤

3.1. redo log (重做日志)

确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

redo log什么时候产生?

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

redo log什么时候删除?

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,redo log占用的空间就可以被重用(被覆盖)。

3.2. undo log(回滚日志)

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。

undo log什么时候产生

事务开始之前,将当前数据的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。

undo log什么时候删除

当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

undo log 和redo log 主要用来保证事务相关操作,除此之外还有binlog(二进制日志,用于主从复制和基于时间点的还原等)、errorlog(错误日志)等

四、脏页是什么?何时刷新脏页

4.1 mysql脏页

当内存数据页和磁盘数据页上的内容不一致时,我们称这个内存页为脏页,内存数据写入磁盘后,内存页上的数据和磁盘页上的数据就一致了,我们称这个内存页为干净页。

4.2 刷脏页的时机

  • redo log写满时,没有空间了,此时需要将checkpoint向前推进,推进的这部分日志对应的脏页刷入到磁盘,此时所有的更新全部阻塞,写的性能变为0,必须待刷一部分脏页后才能更新。
  • 系统内存不足时,需要将一部分数据页淘汰掉,如果淘汰的是脏页,需要先将脏页同步到磁盘。
  • MySQL认为空闲的时候进行刷新。
  • MySQL正常关闭之前,会把所有脏页刷入磁盘。

五、sql优化或你做过哪些方面的优化

  1. 考虑where和order等涉及的字段上建立索引,当然索引不是越多越好,建的多影响更新、插入性能。
  2. 字段已经有索引了,则需要避免索引失效,如:避免对索引字段进行计算操作(如num+1等),避免使用函数,避免索引字段使用not,<>,!=,IS NULL,IS NOT NULL,LIKE等,同时要注意索引字段的顺序,遵循最左匹配原则。
  3. 避免使用DISTINCT,order等耗资源的操作
  4. select语句中避免使用select * from 使用明确的字段代替*号
  5. 多表关联查询时,数据量小的表在前,数据量大的表在后
  6. 针对复杂的SQL语句,考虑拆分成多个单条语句,在业务上处理

六、包含子查询语句的SELECT语句的执行过程

  1. 解析SQL语句:将SQL语句解析成语法树,并对语法树进行语义分析。语法树是一个树状结构,它将SQL语句中的各个元素按照一定的规则组织起来,以便数据库引擎进行处理。

  2. 执行子查询:对子查询进行解析和语义分析,并生成子查询的结果集。子查询是一个嵌套在外部查询中的查询,它可以返回一组值,这组值可以作为外部查询的过滤条件或计算条件。子查询可以是一个SELECT语句、一个表达式、一个常量或者一个函数调用。

    子查询的执行过程类似于普通的SELECT语句的执行过程,也需要进行解析、优化和执行。数据库引擎会首先解析子查询,然后生成执行计划,最后执行查询并返回结果集。如果子查询中包含其他子查询,则需要按照嵌套的层次依次执行。子查询的结果集可以存储在内存或者磁盘中,以便后续查询操作快速访问。

  3. 执行外部查询:使用子查询的结果集进行处理,生成一个临时的虚拟表格。该表格包含了所有符合外部查询条件的行和子查询结果集中的所有行。外部查询可以使用该虚拟表格进行排序、分组、聚合等操作。如果外部查询中包含了GROUP BY、HAVING、ORDER BY、DISTINCT等关键字,那么在处理过程中需要对临时表格进行分组、聚合、排序等操作。

  4. 返回结果集:将临时表格中的数据按照需要的顺序返回给用户。如果存在LIMIT限制,则只返回指定的行数。在返回结果集之前,数据库引擎还需要对结果集进行格式化,包括将日期、时间等数据类型转换成适当的格式,将NULL值转换成适当的表示方式等。

需要注意的是,在执行包含子查询语句的SELECT语句时,数据库引擎会优化查询计划,以提高查询性能。通常情况下,数据库引擎会将子查询的结果集存储在内存或者磁盘中,以便后续查询操作快速访问。另外,如果外部查询中的WHERE条件能够过滤掉大部分不符合条件的行,那么数据库引擎也会尽可能地减少扫描的数据量,以提高查询性能。文章来源地址https://www.toymoban.com/news/detail-721226.html

到了这里,关于【MySQL系列】- Select查询SQL执行过程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【MySQL系列】- SELECT语句执行顺序

    2.1 执行FROM操作 这一步需要做的是对FROM子句前后的两张表进行笛卡尔积操作,也称作为交叉连接,生成虚拟表VT1。如果FROM子句前的表包含a行数据,FROM子句后的表中包含b行数据,那么虚拟表VT1将包含a*b行数据。 2.2 应用ON过滤器 SELECT查询共有3个过滤流程,分别是ON、WHERE、

    2024年02月08日
    浏览(35)
  • mysql connector 执行 select 和 shardingshpere-proxy 的处理过程

    use java mysql connector 按照直觉, 既然用了 preparedStatement, 执行过一次后会在服务端缓存好预编译的语句, 之后就能省去这个解析过程,直接提交参数执行就好了 但是, mysql connector 默认创建的是 ClientPreparedStatement 因为默认并没有设置 useServerPrepStmts = true, 默认是false 去指定要

    2023年04月18日
    浏览(19)
  • 玩转Mysql系列 - 第6篇:select查询基础篇

    这是Mysql系列第6篇。 环境:mysql5.7.25,cmd命令中进行演示。 DQL(Data QueryLanguage):数据查询语言,通俗点讲就是从数据库获取数据的,按照DQL的语法给数据库发送一条指令,数据库将按需求返回数据。 DQL分多篇来说,本文属于第1篇。 基本语法 注意: select语句中不区分大小写

    2024年02月11日
    浏览(26)
  • MySQL Select 查询语句详解及高级用法

    MySQL是一个开源的关系型数据库管理系统,支持多种操作语言,其中最基础、最常用的命令之一就是SELECT语句。在本篇文章中,这里将详细介绍MySQL SELECT语句的各个方面,从最基本的查询语句,到更高级的技巧和功能。 SELECT语句用于从表格中检索数据。其基本语法如下: sq

    2024年02月08日
    浏览(32)
  • 【MySQL性能优化】- MySQL结构与SQL执行过程

    😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页   @怒放吧德德  To记录领地 🌝分享学习心得,欢迎指正,大家一起学习成长! 上阶段初步学习了索引与优化,以及对Explain的使用,接着来就来初识一下SQL执行

    2024年01月21日
    浏览(33)
  • 玩转Mysql系列 - 第7篇:玩转select条件查询,避免采坑

    这是Mysql系列第7篇。 环境:mysql5.7.25,cmd命令中进行演示。 电商中:我们想查看某个用户所有的订单,或者想查看某个用户在某个时间段内所有的订单,此时我们需要对订单表数据进行筛选,按照用户、时间进行过滤,得到我们期望的结果。 此时我们需要使用条件查询来对

    2024年02月11日
    浏览(25)
  • MySQL面试题:一条SQL语句在MySQL中执行过程全解析

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

    2024年02月03日
    浏览(31)
  • MySQL内部机制:SQL语句的执行过程浅析

    目录 1. 连接与认证 2. 解析与优化 3. 查询缓存 4. 打开表和读取数据 5. 执行 6. 返回结果 7. 日志记录 8. 关闭连接 当我们在MySQL中执行一个SQL语句时,背后发生了一系列的操作和步骤。下面是一个简化的概述,描述了SQL语句在MySQL中的执行过程或原理: 客户端(如应用程序或命

    2024年03月12日
    浏览(37)
  • 【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

    慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来 explain + 慢SQL分析 show Profile。(比explain还要详细,可以查询SQL在MySQL数据库中的执行细节和生命周期情况) 运维经理 OR DBA,进行MySQL数据库服务

    2024年02月13日
    浏览(23)
  • mysql 简单定位慢查询并分析SQL执行效率

    实际的日常开发工作中可能会遇到某个新功能在测试时需要很久才返回结果,这时就应该分析是不是慢查询导致的,如果确实有慢查询,就需要来学习怎么找到慢查询和怎么分析 SQL 执行效率? 定位慢 SQL 有如下两种解决方案: 查看慢查询日志确定已经执行完的慢查询 show

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包