技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题

MySQL的体系结构与SQL的执行流程 如果你在使用MySQL时只会写sql语句的,那么你应该看一下《MySQL优化的底层逻辑》。如果你只了解到sql是如何优化的,那么你应该通过本文了解一下Mysql的体系结构以及sql语句的执行流程。 阅读详情

欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答

SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可以给我们得到什么样的结果,但我们如果把这条语句写错或是数据库表设计上有什么缺陷,会引发什么错误我们却无从得知,所以今天想分享一下在MySQL体系下SQL语句大致上是如何在系统中执行的,在以后SQL语句提示错误时将更好定位问题。

1、问题导入

我们以一条SELECT语句为例,我们知道SELECT语句是属于我们的DML下的DQL语言,它可以通过我们指定的字段列表和表列表并进行条件的描述来查询某张数据表中我们所需要的某些数据。假设:

mysql> select * from test_table where sname = '王五';
+-----+-------+---------+
| sno | sname | major   |
+-----+-------+---------+
|   1 | 王五  | English |
+-----+-------+---------+
1 row in set (0.00 sec)

如果我们将字段SELECT漏写成ELECT,将会:

mysql> elect * from test_table where sname = '王五';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from test_table where sname = '王五'' at line 1

我们通过观察use near后方提示的内容:''elect * from test_table where sname = '王五'' at line 1,可得知我们的SELECT语句写错了。

2、MySQL基本架构

那么我们在执行SQL语句的过程究竟是什么样的呢?我们需要分析一下MySQL的基本架构。如下图所示:

file

MySQL可以分为Server层和存储引擎层两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始取代MyISAM成为了默认存储引擎。

也就是说,你执行CREATE TABLE语句建表的时候,如果不指定引擎类型,默认使用的就是InnoDB。不过,你也可以通过指定存储引擎的类型来选择别的引擎,通过engine=MyISAM, 来指定使用内存引擎创建表。不同存储引擎的表数据存取方式不同,支持的功能也不同。不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。接着,我们结合之前提到的SELECT语句来分析一下它是如何在其中运行的。

2.1、连接器

首先,要使用我们数据库,第一步操作就是使用:mysql -uusername -p连接数据库,-u指定用户名,-p指定密码。连接命令中的mysql是客户端工具,是访问MySQL服务器的客服端程序,用来跟服务端建立连接。在进行TCP协议的三次握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。如果此时管理员对该用户进行了某个权限的GRANT,需要该用户断开本次连接后,重新与其建立连接才可以生效。我们也可以用show processlist语句查看当前的连接。

mysql> show processlist;
+----+-----------------+-----------------+--------+---------+---------+------------------------+------------------+
| Id | User            | Host            | db     | Command | Time    | State                  | Info             |
+----+-----------------+-----------------+--------+---------+---------+------------------------+------------------+
|  5 | event_scheduler | localhost       | NULL   | Daemon  | 1389806 | Waiting on empty queue | NULL             |
| 22 | root            | localhost:57464 | mytest | Query   |       0 | init                   | show processlist |
+----+-----------------+-----------------+--------+---------+---------+------------------------+------------------+
2 rows in set (0.01 sec)

因为MySQL是基于C/S结构的软件,所以,我们的客户端通过这种方式与服务端建立连接,那么后续与服务端的交互就是面向于mysqld服务器程序了,基本交互流程大致为:

  • 1、客户端通过服务服务器的程序—mysql语句连接服务器,并认证身份及权限客户端发送SQL指令
  • 2、服务端接收SQL指令并处理SQL指令,返回指令操作结果
  • 3、客户端接收结果进行解析,最后显示结果
  • 4、客户端选择发送新SQL指令或断开与服务端连接释放资源

2.2、查询缓存

在建立连接后,我们查询数据,首先会经过查询缓存,缓存中会记录许多key-value,key是之前执行过的查询语句,value则对应语句的查询结果,如果在缓存中找不到对应的key才会继续往下方执行,但,在MySQL 8.0版本已经直接将查询缓存的整块功能删掉了,这里不多做赘述。

2.3、分析器

到这里就真正执行SQL语句了。首先,MySQL需要知道我们现在的语句要做什么,因此需要对SQL语句做解析。分析器先会对我们的语句做词法与语义的分析。我们输入的SQL语句是由多个单词(字符串)和空格组成的,MySQL需要识别出里面的字符串分别是什么,代表了什么意思。

MySQL将我们输入的"SELECT"这个字段识别出来,得知这是一个查询语句,用于检索表内记录。它也要把字符串test_table识别成数据库表test_table,把字符串sname识别成列sname。

识别完成后,就要做语法分析了。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。就比如前面的SELECT少写了一个S,就会收到“You have an error in your SQL syntax”的错误提示。

当然,也会检查语句中的部分是否有误,比如输入一个错误的列名,此列在表中并不存在,则会提示不存在对应列。

2.4、优化器

经过了分析器,MySQL知道我们的语句要做什么事了。在开始完成要做的事之前,还要先经过优化器的处理。

优化器是对于我们SQL语句进行一定的优化方案,就好比我们使用CREATE TABLE语句建数据库时通过SHOW CREATE TABLE TABLE_NAME \G查看存储的建表语句的时候,发现往往我们建表的语句和实际存储的语句是不一样的。又比如数据库表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表联结(JOIN)的时候,决定各个表的联结顺序以及过滤条件如何进行判断。

优化器优化完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

2.5、执行器

MySQL通过分析器知道了我们的语句要做什么事情,再通过优化器知道了该怎么做,于是就进入了执行器开始执行我们的SQL语句。

在执行的过程中,MySQL会判断目前连接用户是否具有对于对应数据库表的对应操作权限,因此,这里会判断目前连接用户是否对于test_table表具有SELECT权限,如果没有,就会返回该用户没有对于本表的对应权限的错误。

如果该连接用户具有操作test_table表的对应权限,就打开对应test_table表继续执行SQL语句。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

  • 这里假设未设置索引,且版本在8.0以上,引擎默认,所以调用InnoDB引擎接口取test_table表的第一行,判断sname的值是不是'王五',如果不是则跳过,用引擎接口取到下一行。如果是则将这行存在结果则找出数据,再调用引擎接口取到下一行,直到查找到最后一行,最后执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
  • 如果是有设置索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。

3、小结

以上是对MySQL整体大致结构的总结,通过一条SQL语句,我们大致观察了全貌,作为DBA需要对MySQL整体结构有一定认识,这样有助于我们更好地理解MySQL的内部是如何运作的,在知道语句如何运作的情况下,也方便我们快速锁定问题和加强对具体业务的应用能力。

Enjoy GreatSQL :)

文章推荐:

GreatSQL MGR FAQ https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA

万答#12,MGR整个集群挂掉后,如何才能自动选主,不用手动干预 https://mp.weixin.qq.com/s/07o1poO44zwQIvaJNKEoPA

『2021数据技术嘉年华·ON LINE』:《MySQL高可用架构演进及实践》 https://mp.weixin.qq.com/s/u7k99y6i7riq7ScYs7ySnA

一条sql语句慢在哪之抓包分析 https://mp.weixin.qq.com/s/AYibbzl860D90rOeyjB6IQ

万答#15,都有哪些情况可能导致MGR服务无法启动 https://mp.weixin.qq.com/s/inSGpd0Q_XIl2Mb-VsvNsA

技术分享 | 为什么MGR一致性模式不推荐AFTER https://mp.weixin.qq.com/s/rNeq479RNsklY1BlfKOsYg

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili: https://space.bilibili.com/1363850082/video

微信&QQ群: 可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697 微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

一条 SQL 查询语句是如何执行的(MySQL) 整个 MySQL 架构分为与。 阅读详情

相关推荐

老司机避坑指南:UC3842自举驱动电路发热严重?这样选C39/C37电容值最稳

本文针对UC3842自举驱动电路发热严重的问题,深入剖析了驱动波形边沿速度与损耗的矛盾根源。通过实测数据与热成像分析,重点阐述了关键电容C39/C37的选型策略,提供了从经验公式到量化计算的优化方法,帮助工程师在发热与效率间找到最佳平衡点,并探讨了分立方案与专用驱动IC的适用场景。

lambda的博客 747

一条SQL语句在MySQL中执行过程全解析

本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。

ratel的博客 3万+

数据采集卡架构与PCIe优化设计详解

数据采集卡(DAQ)作为工业自动化中的关键设备,其核心在于模数转换(ADC)和数字信号处理技术。现代系统普遍采用PCIe总线架构,通过DMA传输和时钟同步技术实现高速数据采集。在信号调理环节,可编程增益放大器(PGA)和抗混叠滤波器确保信号质量;而Σ-Δ型ADC则提供高达24位的分辨率。实际应用中,从电力监测到机床振动分析,数据采集卡需要结合具体场景优化配置。通过合理的PCB布局和EMI防护设计,可以有效提升系统在工业环境中的可靠性。

weixin_29168675的博客 912

【SQL】Mysql中一条sql语句的执行过程

假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

double222222的博客 3448

SAP公司间采购后台配置及前台操作详解

公司间采购后台配置及前台操作详解 SAP 实施中公司间交易几乎每个项目都会有此业务需求,比如内地很多公司都会在香港设置贸易型子公司。通过香港公司接单,然后转内地公司生产,或内地公司通过香港公司采购进口原材料,这些业务必然会涉及到公司间交易,下面我将详细说明下SAP是如何实现这种业务场景的,供大家参考。 配置前必须前台先创建公司间供应商主数据和客户主数据 1. 创建相应的客户主数据 功能说明 公司间...

weixin_40672823的博客 1万+

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

图解MySQL的SQL语句执行全流程,看看自己的SQL语句是如何执行的

MySQL作为一种广泛使用的开源关系型数据库管理系统,其SQL语句的执行流程对于理解数据库性能优化、错误排查以及数据库设计都至关重要。

小白的大数据之旅的博客 1417

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

MYSQL——SQL语句到底怎么执行

MySQL的具体执行流程什么?这是高频的面试题,分为查询语句流程和更新语句流程,作为开发人员必备知识储备!

weixin_47088026的博客 1348

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1800

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

【数字IC刷题】华为海思数字IC笔试题(3)详细解析版

MoorePlus的博客 2370

MySQL:SQL语句执行过程

本文主要介绍SQL语句的执行过程

AWSDN的博客 1735

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

深入剖析 MySQL:一条 SQL 语句的执行之旅

通过对 MySQL 中一条 SQL 语句执行过程的详细分析,我们可以看到 SQL 语句的执行是一个复杂的过程,涉及到多个组件的协同工作。了解这个过程对于优化数据库查询、提高系统性能非常重要。在实际应用中,我们可以通过合理设计数据库结构、选择合适的存储引擎、创建有效的索引等方式,提高 SQL 语句的执行效率。

果酱 の 博客 1397

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL执行计划Explain如何分析 SQL语句?

之前写过相关的执行计划分析语句,但是内容是五年前写的,马马虎虎的,观感极差。所以这篇是弥补五年前的马虎而做。首先,执行计划的用法是在查找语句前使用EXPLAIN 关键字,执行完以后会返回一个表格,其中表格的字段有id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra等。每个列都有不同的含义,需要逐一理解。id:表示查询中执行select子句或操作表的顺序。id相同,执行顺序由上至下;

qq_39126115的博客 1683

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

连接器主要和身份认证和权限相关的功能相关,就好比一个级别很高的门卫一样。主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作,如果用户账户密码已通过,连接器会到权限表中查询该用户的所有权限,之后在这个连接里的权限逻辑判断都是会依赖此时读取到的权限数据,也就是说,后续只要这个连接不断开,即使管理员修改了该用户的权限,该用户也是不受影响的。

kfashfasf的博客 1502

什么是SQL,什么是MYSQL?SQL执行语句的过程是什么?

SQL是一种用于管理关系型数据库系统(RDBMS)的标准化语言。它允许用户创建、更新、查询和管理数据库中的数据。SQL语言使用简洁的语法和关键字,通过指定需要执行的操作来与数据库进行交互。

2301_77899321的博客 1196

详解Mysql的一条sql语句的执行过程

详解MYSQL的SQL语句执行过程

m0_66220639的博客 1840

分析SQL 语句执行慢的问题

确认慢 SQL:通过慢查询日志定位具体 SQL。排除环境干扰:检查锁等待、资源瓶颈(CPU / 内存 / IO)。分析执行计划:通过explain查看typekeyExtra等字段,定位索引问题、扫描方式问题。针对性优化:从索引、SQL 改写、表结构、参数等维度解决瓶颈。

m0_64630668的博客 1037

MySQL SQL语句执行流程详解

一条SQL语句在MySQL中的执行过程是一个复杂而精细的过程,它涉及多个阶段和组件的协同工作。

学习和分享 1449

sql 语句在 MySQL 中的执行流程分析

本文来自木木匠投稿。 一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 1.2 Server 层基本组件介绍 1) 连接器 2) 查询缓存(MySQL 8.0 版本后移除) 3) 分析器 4) 优化器 5) 执行器 二 语句分析 2.1 查询语句 2.2 更新语句 三 总结 四 参考 本篇文章会分析下一个 sql 语句在 MySQL 中的执行流程,包括 ...

dooduoaixuexi的博客 962

【MySQL】SQL语句执行流程

详细解析MySQL中sql语句的执行过程

秋玄的博客 1853

Sql语句的执行原理-MySQL

第一步:应用程序把查询SQL语句发送给服务器端执行。 我们在数据库层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。 第二步:查询缓存 服务器在解析一个查询语句之前,如果查询缓存是打开的(MySQL默认打开,可以使用have_query_cache查看),在接收到查询请求后,并不会直接去数据库查询,而是在数据库的查询缓存中找是否有相对应的查询数据(某条给定...

qq_32998153的博客 5797

SQL语句在MySQL的执行过程

先对MySQL的一些基础组件进行简单的介绍1.连接器:身份认证和权限相关。2.查询缓存:执行查询语句时,会先查询缓存(MySQL8.0版本后移除)。3.分析器:词法分析和语法分析,词法分析即对一条SQL语句中的关键字进行提取,如select、insert、update、表名、字段名等等,语法分析即查看SQL语句是否有语法错误。4.优化器:根据MySQL内部的优化算法按照最优方案执行SQL。5.执行器:执行语句,然后从存储引擎返回数据。MySQL主要分为server层和存储引擎层。

2301_82014959的博客 1257

SQL语句的执行过程

SQL语句的执行流程

2301_81453175的博客 1422

MySQL中SQL语句的执行过程详解

MySQL的分层体系结构使其具有高度的灵活性和可扩展性。每一层各司其职,共同实现高效的数据管理和操作。通过这种结构,MySQL不仅可以提供高效的查询和数据存储,还能通过不同的存储引擎满足各种应用场景的需求。

le12345678934694的博客 2287
上一篇: 在Linux下源码编译安装GreatSQL/MySQL
下一篇: GreatSQL重磅特性,InnoDB并行并行查询优化测试
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值