MySQL执行一条查询语句的过程

查询缓存

在解析一个查询语句之前,如果查询缓存时打开的,那么 MySQL 会优先检查这个查询是否命中查询缓存中的数据。这个检查时通过一个对大小写敏感的哈希查找实现的。查询和缓存中的查询即使只有一个字节不同,那也不会匹配缓存结果。

如果当前的查询恰好命中了缓存,那么在返回结果之前 MySQL 会检查一次用户权限。这仍然是无须解析查询 SQL 语句的,因为在查询缓存中已经存放了当前查询需要访问的表信息。如果权限没有问题,MySQL 会跳过所有其他阶段,直接从缓存中拿到结果并返回给客户端。跳过了解析、优化和执行阶段。

查询缓存系统跟踪查询表中涉及的每个表,如果这些表发生更改,则与该表关联的所有缓存数据都将无效。这种机制似乎效率不高,因为当数据更改时,相应的查询结果可能不会改变,但这种简单的实现成本非常低,这对于非常繁忙的系统非常重要。

[En]

The query cache system tracks each table involved in the query table, and if these tables change, all cached data associated with that table will be invalidated. This mechanism seems inefficient because it is likely that the corresponding query results do not change when the data changes, but this simple implementation costs very little, which is very important for a very busy system.

query_cache_type

是否打开查询缓存。可以设置成 OFF、ON 或者 DEMAND。DEMAND 表示只有在查询语句中明确写明 SQL_CACHE 的语句才放入查询缓存。

query_cache_size

查询缓存使用的总内存空间,单位是字节。这个值必须是 1024 的整数倍,否则 MySQL实际分配的数据会和你指定的略有不同。

query_cache_min_res_unit

在查询缓存中分配内存块时的最小单位。

[En]

The smallest unit when allocating memory blocks in the query cache.

query_cache_limit

MySQL 能够缓存的最大查询结果。如果查询结果大于这个值,则不会被缓存。

query_cache_wlock_invalidate

如果某个数据表被其他的连接锁住,是否仍然从拆线呢缓存中返回结果。这个参数默认是 OFF,这可能在一定程度上会改变服务器的行为,因为这使得数据库可能返回其他线程锁住的数据。将参数设置为 ON,则不会从缓存中读取这类数据,但是这可能会增加锁等待。对于绝大多数应用来说无需注意这个细节,所以默认设置通常是没有问题的。

语法解析器和预处理

首先,MySQL 通过关键字将 SQL 语句进行解析,并生成一颗对应的”解析树”。MySQL 解析器将使用 MySQL 语法规则验证和解析查询。例如,它将验证是否使用错误的关键字,或者使用关键字的顺序是否正确等,再或者它还会验证引号是否能前后正确匹配。

预处理器则根据一些 MySQL 规则进一步检查解析树是否合法,例如,这里将检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。

下一步是由预处理器验证权限。这通常是快速的,除非在服务器上配置了大量权限。

[En]

The next step is for the preprocessor to verify permissions. This is usually fast, unless there are a lot of permissions configured on the server.

查询优化器

语法树现在被认为是合法的,优化器将其转换为执行计划。查询可以通过多种方式执行,所有方式都会返回相同的结果。优化器的作用是找到最佳的执行计划。

[En]

The syntax tree is now considered legal, and the optimizer converts it into an execution plan. A query can be executed in many ways, all of which return the same result. The role of the optimizer is to find the best execution plan.

MySQL 使用基于成本的优化器,它将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。

MySQL 查询优化器在生成查询的执行计划时,需要向存储引擎获取相应的统计信息。存储引擎则提供给优化器对应的统计信息,包括:每个表或索引有多少个页面、每个表的每个索引的基数是多少、数据行和索引长度、索引的分布信息等。优化器根据这些信息来选择一个最优的执行计划。

查询执行引擎

相对于查询优化阶段,查询执行阶段不是那么复杂:MySQL 只是简单地根据执行计划给出地指令逐步执行。在根据计划逐步执行的过程中,有大量的操作需要通过调用存储引擎实现的接口来完成。

返回结果给客户端

查询执行的最后一个阶段是将结果返回给客户端。即使查询不需要返回结果集给客户端,MySQL 仍然会返回这个查询的一些信息,如该查询影响到的行数。

如果查询可以被缓存,那么 MySQL 在这个阶段也会将结果存放到查询缓存中。

Original: https://www.cnblogs.com/woods1815/p/15253941.html
Author: 幽篁晓筑
Title: MySQL执行一条查询语句的过程

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

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

(0)

大家都在看

  • 03-MySQL事务

    数据库事务 1、事务特性 1.1、原子性 即不可分割性,事务要么全部被执行,要么就全部不被执行 1.2、一致性 事务的执行使得数据库从一种正确状态转换成另一种正确状态 1.3、隔离…

    数据库 2023年6月16日
    0102
  • RadonDB MySQL on K8s 2.1.2 发布!

    RadonDB MySQL on Kubernetes 于 2 月 17 日发布了新版本 2.1.2 。该版本在节点的重建、增删等方面进行了全面升级。致谢: 首先感谢 @andyl…

    数据库 2023年5月24日
    079
  • JavaScript 获取 Url 上的参数(QueryString)值

    获取URL里面传的参数,在Js中不能像后台一样使用Request.QueryString来获取URL里面参数,下面介绍两种方式用来获取参数 方式一:使用split分隔来获取,这种方…

    数据库 2023年6月9日
    078
  • 解决PHP undefined function mcrypt_encrypt()的报错问题

    今天迁移服务器代码遇到了一个未定义的错误 查找了相关资料后,发现是缺少php_mcrypt扩展 于是去下载扩展: https://windows.php.net/downloads…

    数据库 2023年6月14日
    088
  • gauss正则找汉字

    select substring( ‘沙特阿拉伯6.20’ from ‘[\u4E00-\u9FA5]{2,5}’ )返回 ‘沙特阿拉伯’ Original: https://ww…

    数据库 2023年6月16日
    075
  • 【JDBC】笔记(4)— JDBC 事务自动提交机制;账户转账演示事务代码(bug版+修正版)

    楔子: JDBC 的事务默认是自动提交的: 只要执行一条 DML语句,则自动提交一次。但是在实际的业务中,通常是多条 DML语句 联合完成的,那么就必须保证这些 DML语句 在同一…

    数据库 2023年5月24日
    0141
  • MySQL中读页缓冲区buffer pool

    Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理。我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其…

    数据库 2023年5月24日
    0111
  • Java 全栈知识体系(2021 PDF 版本)

    40000 +字长文总结,民工哥已将此文整理成PDF文档了,需要的见文后下载获取方式。 全栈知识体系总览 Java入门与进阶 面向对象与Java基础 Java 基础 –…

    数据库 2023年6月9日
    075
  • 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架——Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要…

    数据库 2023年6月14日
    0102
  • 基于PHP7.2+MySQL5.7的回收租凭系统

    likeshop回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零钱提现。支持在线…

    数据库 2023年5月24日
    0117
  • grafana+prometheus如何查看tcp连接数量

    最后解决方案 经过和负责监控的大佬了解,获得了一个可行的方案:在每个pod中新增一个sidecar容器,在容器中部署node_exporter,或者在容器中放个自动查看端口连接数并…

    数据库 2023年6月9日
    0121
  • MySQL45讲之优化器选错索引

    前言 本文简要介绍了优化器选择索引的依据,以及如何人为地引导优化器选择较好的执行方案。 [En] This paper briefly introduces the basis f…

    数据库 2023年5月24日
    0124
  • docker-compose部署rocketmq

    docker-compose安装: Ubuntu下载docker-compose文件 sudo curl -L https:/…

    数据库 2023年6月11日
    084
  • MySQL存储过程和函数

    存储过程与函数 类似与Java的方法和C语言的函数 存储过程概述 含义 一组经过 预先编译的SQL语句的封装 执行过程:存储过程预先存储在MySQL服务器上,客户端发出命令后,服务…

    数据库 2023年5月24日
    086
  • jdbc-使用工具类

    package com.cqust; import com.cqust.utils.JDBCUtil; import java.sql.Connection;import java…

    数据库 2023年6月11日
    069
  • postman自动化测试

    postman做接口的自动化测试case 记录一次自动化测试的工作,以及该过程中对于测试设计的一些思考。 postman工具 简单介绍,这个工具无论是开发还是测试,使用来调试接口的…

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