MySQL基础三问:底层逻辑、正在执行、日志观察

SQL底层执行原理详解 4. #binlog格式,有3种statement,row,mixed (statement:记录的是操作记录的语句,会造成主从不一致;看重点信息,比如begin,commit这种 关键词信息,只要在binlog当中看到了,你就可以理解为begin-commit之间的信息是一个完整的事务逻辑,然后再根据位置 position判断恢复即可。删库是不需要跑路的,因为我们的SQL执行时,会将sql语句的执行逻辑记录在我们的bin-log当中,什么是bin-log呢?会多一个最新的bin‐log日志。 阅读详情

背景及目录:

经常面试会遇到且实际工作中也会应用到的三个场景:

一.mysql查询时的底层原理是什么?

二.如何查看正在执行的mysql语句?

三.如何观察mysql运行过程中的日志信息?

- - - - - - - - - -分割线- - - - - - - - - - -

一.mysql查询时的底层原理是什么?

mysql底层使用的组件主要分别两个部分:包含Server层与Store层

Server层

主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

Store层

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。也就是说如果我们在create table时不指定表的存储引擎类型,默认会给你设置存储引擎为InnoDB。

1.连接器:

使用各种客户端连接mysql时会使用到连接器,这些客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。 连接器负责跟客户端建立连接、获取权限、维持和管理连接。连接命令一般是这么写的:

[root@192 ~]# mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306

mysql -u root -p

连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码;如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行

连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限,连接成功如下

​show grants for root@"%"; 查看当前用户的权限

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

查看当前mysql实例是否开启缓存机制:

mysql> show global variables like "%query_cache_type%";

监控查询缓存信息:

mysql> show status like'%Qcache%'; //查看运行的缓存信息

如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高建议大家在静态表里使用查询缓存,什么叫静态表呢?就是一般我们极少更新的表。比如,一个系统配置表、字典表,那这张表上的查询才适合使用查询缓存。好在 MySQL 也提供了这种“按需使用”的方式。你可以将my.cnf参数 query_cache_type 设置成 DEMAND。

my.cnf #query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存 query_cache_type=2

2.分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。

分析器先会做“词法分析”。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。

MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”。

做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒,比如下面这个语句 from 写成了 "rom"。

分析器分成6个步骤:

(1)词法分析 (2)语法分析 (3)语义分析 (4)生成执行树 (5)生成执行计划(6)计划执行

3.优化器

优化器决定了要使用的索引,各个表的连接顺序

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如你执行下面这样的语句,这个语句是执行两个表的 join:

既可以先从表 test1 里面取出 name=yangguo的记录的 ID 值,再根据 ID 值关联到表 test2,再判断 test2 里面 name的值是否等于 yangguo。

也可以先从表 test2 里面取出 name=xiaolongnv 的记录的 ID 值,再根据 ID 值关联到 test1,再判断 test1 里面 name 的值是否等于 yangguo。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段

4.执行器

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限)。

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

比如我们这个例子中的表 test 中,ID 字段没有索引,那么执行器的执行流程是这样的:

(1)调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;

(2)调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

(3)执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。对于有索引的表,执行的逻辑也差不多。第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。你会在数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟 rows_examined 并不是完全相同的。

5.bin-log归档

删库是不需要跑路的,因为我们的SQL执行时,会将sql语句的执行逻辑记录在我们的bin-log当中,什么是bin-log呢?

binlog是Server层实现的二进制日志,他会记录我们的cud操作。Binlog有以下几个特点:

(1)Binlog在MySQL的Server层实现(引擎共用)

(2)Binlog为逻辑日志,记录的是一条语句的原始逻辑

(3)Binlog不限大小,追加写入,不会覆盖以前的日志

如果,我们误删了数据库,可以使用binlog进行归档!要使用binlog归档,首先我们得记录binlog,因此需要先开启MySQL的binlog功能。

配置my.cnf

配置开启binlog log-bin=/usr/local/mysql/data/binlog/mysql-bin 注意5.7以及更高版本需要配置本项:server-id=123454(自定义,保证唯一性); #binlog格式,有3种statement,row,mixed binlog-format=ROW #表示每1次执行写入就与硬盘同步,会影响性能,为0时表示,事务提交时mysql不做刷盘操作,由系统决定 sync-binlog=1 复制代码

binlog命令:

mysql> show variables like '%log_bin%'; 查看bin-log是否开启 mysql> flush logs; 会多一个最新的bin-log日志 mysql> show master status; 查看最后一个bin-log日志的相关信息 mysql> reset master; 清空所有的bin-log日志

二.如何查看正在执行的mysql语句?

首先:processlist表位于information_schema库中,主要是存储的MySQL线程的一些基本信息。我们使用

desc information_schema.processlist来查看表结构:

ID: 线程的id USER: 线程属于哪一个用户 HOST:客户端的host信息:hostname+端口 DB:线程在哪一个数据库下 COMMAND:线程使用哪一种命令在执行,空闲的线程状态为sleep TIME:线程已经运行的时间,秒为单位 STATE:线程正在做什么:当前的状态,行为,或者事件 INFO:线程正在执行的语句,但是这个并不是很准确,所以需要使用其他的方式来完成我们的目标。 使用show processlist 或者 select * from information_schema.processlist查看processlist表

并且可以直接kill掉卡死的进程信息

show processlist select * from information_schema.processlist

1.拿到正在执行的processlist_id

select id from information_schema.processlist

2.拿到与processlist_id对应的thread_id

select thread_id from performance_schema.threads where processlist_id in (上一步拿到的processlist_id列表)

3.拿到正在执行的sql语句

select thread_id, sql_text from performance_schema.events_statements_current where thread_id in (上一步拿到的thread_id列表)

4.完整的sql语句如下:

SELECT a.*, c.thread_id, c.sql_text from information_schema.processlist a LEFT JOIN performance_schema.threads b on a.id = b.PROCESSLIST_ID LEFT JOIN performance_schema.events_statements_current c on c.THREAD_ID = b.THREAD_ID;

​三.如何观察mysql运行过程中的日志信息?

查看主要之前说bin-log日志信息。

1.查看是否启用了日志:

show variables like 'log_bin';

2.查看当前的日志

show master status;

 3.查看日志文件内容:

mysqlbinlog binlog.0000294.mysql有以下几种日志:

错误日志: -log-err

查询日志: -log

慢查询日志: -log-slow-queries

更新日志: -log-update

二进制日志: -log-bin

MySQL SQL执行全链路解析:从连接到返回的底层原理与性能优化 在数据库系统中,SQL查询的执行是一个涉及多组件协同的复杂过程。其核心原理遵循从连接管理、语法解析、查询优化到物理执行的标准化流程。理解这一流程的技术价值在于,它构成了数据库性能优化的底层基础,使开发者能够精准定位瓶颈,例如索引失效、锁等待或优化器决策失误。在应用场景上,无论是OLTP在线事务处理还是数据分析,高效的SQL执行都直接关系到系统响应时间和吞吐量。本文聚焦于MySQL,深入剖析一条查询语句的完整生命周期,涵盖连接建立、权限验证、解析器工作、优化器成本估算以及InnoDB存储引擎的数据访问机制,并 阅读详情

相关推荐

MySQL三大日志机制解析:redo log、bin log与undo log

数据库日志系统是确保数据一致性与可靠性的核心技术组件。在关系型数据库中,日志机制通过记录数据变更实现事务的ACID特性,其中WAL(预写式日志)是最核心的实现原理之一。MySQL通过redo log、bin log和undo log三大日志的协同工作,分别解决崩溃恢复、数据复制和事务回滚等关键问题。redo log采用物理日志形式确保事务持久性,bin log以逻辑日志实现主从复制,而undo log则支撑MVCC多版本并发控制。理解这些日志的工作原理,对于处理数据库崩溃恢复、优化高并发场景下的IO性能、以

weixin_32642109的博客 262

MySQL如何查看未提交的事务SQL

点击上方蓝字关注我MySQL中经常遇到事务中的SQL正在执行或执行完成后未提交,如何找出对应的SQL?1. 查看正在执行的SQL查看事务中正在执行的SQL方式有多种,例如1.1 通过processlist查看会话1:执行1个SQLmysql> begin; Query OK, 0 rows affected (0.00 sec) mysql>selectsleep(20),n...

gjc592的博客 5077

代码执行现场显微镜:从源码到硬件的四层穿透观察法

编程的本质不是书写语法,而是理解代码在机器中真实发生的全过程。从高级语言源码,到编译器生成的中间表示(如Java字节码、C预处理代码),再到运行时内存布局与线程状态,最终落于CPU缓存、指令周期等硬件行为——这一‘执行链路’构成了软件工程的认知主干。掌握字节码分析、perf性能采样、jstack线程诊断等底层可观测技术,能系统性弥合‘会写’与‘懂行’之间的认知断层。本文聚焦代码执行现场的分层解构方法,特别强化对中间表示层(IR Layer)和运行时层(Runtime Layer)的实操穿透,帮助开发者摆脱黑

baochuanying9531的博客 431

MySQL日常监控及sys库的使用

MySQL日常监控及sys库的使用## 一、统计信息(SQL维度)1、统计执行次数最多的SQL语句:```sqlSELECTLAST_SEENFROMORDER BY```2、查看平均响应时间最多的sql语句:```sqlSELECTLAST_SEENFROMORDER BY```3、查看排序记录数最多的sql```sqlSELECTLAST_SEENFROMORDER BY```

eagle89的专栏 1215

Debian 8 LAMP实战:理解Web服务底层契约与排错逻辑

LAMP(Linux、Apache、MySQL、PHP)是Web服务最基础的运行范式,其核心在于组件间清晰的职责边界与可验证的协作链路。Apache作为请求调度中枢,PHP以模块化方式嵌入执行,MySQL提供数据持久化契约,三者通过明确定义的端口、配置路径和权限模型协同工作。这种‘无抽象层遮蔽’的设计,使故障域可精准定位——从curl探测HTTP响应,到日志逐层下钻,再到phpinfo()验证扩展加载,形成完整的可观测性闭环。尤其在容器化与云原生环境中,Docker镜像中的/etc/apache2、/etc

weixin_30421809的博客 424

AI时代Java程序员进阶指南:从CRUD到驾驭底层复杂性

在软件开发领域,系统性能优化与高并发处理是衡量工程师能力的关键指标。其核心原理在于深入理解计算机底层机制,如JVM内存管理、并发编程模型与数据库索引结构。掌握这些原理的技术价值在于能够设计出高性能、高可用的系统架构,有效应对海量请求与复杂业务场景。随着AI工具自动化了重复性编码工作,企业更加需要能够解决深层复杂性问题的开发者。本文聚焦于Java工程师如何通过夯实JVM调优、并发编程与MySQL索引等底层知识,构建AI难以替代的系统性思维与架构设计能力,从而在AI时代实现价值跃迁。

深未来技术 393

sql server收缩数据库日志

平常我们会碰到数据库日志文件很多的情况,这个时候我们就需要如何收缩日志 收缩的文件夹如下所示: E:\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA 步骤如下: 第一步:备份日志 登入到主数据库 BACKUP LOG [PRJ_IPES] TO DISK='NUL:' -- 备份事务日志,备份成NUL,就不用占硬盘空间 GO ...

bird_tp的博客 6540

SQL Server INSERT性能深度解析:从语法到底层资源消耗

INSERT是关系型数据库中最基础的DML操作,但在SQL Server中,它远不止语法层面的数据写入——其执行过程深度耦合事务日志、锁机制、统计信息更新、索引维护与tempdb资源调度。理解INSERT的执行原理,有助于识别隐式转换、触发器开销、页分裂、U锁争用等高频性能陷阱;掌握执行计划中的Compute Scalar、Table Spool、Index Insert等关键算子,可精准定位‘简单插入’背后的高延迟根源。本文聚焦SQLServer Insert实际运行时的行为特征与工程调优路径,覆盖高并发

dejz8829的专栏 449

dm归档文件配置、sql 日志的开启和关闭以 及基本的操作、创建定时备份和删除备份的作业、数据库物理、逻辑备份还原

达梦数据库中归档文件配置、sql 日志的开启和关闭以 及基本的操作、创建定时备份和删除备份的作业、通过工具和命令行进行数据库物理、逻辑备份还原

Quiet930187012的博客 924

MySQL SQL执行流程深度解析:从Parser到Executor的完整执行路径

这次我们来看一个 MySQL 内部执行流程的深度解析。当你敲下回车执行一条 SQL 语句时,MySQL 内部并非简单地“执行”,而是经历了一个复杂、精密的处理流水线。这个过程直接决定了查询的效率和结果,也是理解 SQL 优化、排查慢查询、乃至设计高效数据库架构的基石。 对于开发者、DBA 或任何需要与数据库深度交互的人来说,搞清楚这条流水线至关重要。它能帮你从“凭感觉调优”转向“有依据地优化”,比如:为什么加了索引反而更慢?为什么这个查询走全表扫描?如何写出真正高效的 SQL?本文将从一次查询请求的视角出发

weixin_30312563的博客 518

MySQL慢查询诊断四步法:从日志定位到EXPLAIN优化

慢查询是MySQL性能问题的核心表征,其本质是SQL执行计划低效与资源争抢的综合结果。理解slow query log的原始记录机制、long_query_time的业务阈值设定逻辑,以及EXPLAIN输出中type/rows/key/Extra等关键字段的工程含义,是实现精准根因分析的基础。该技术路径不依赖第三方监控,仅通过mysqld.cnf配置、日志解析和原生命令即可完成闭环诊断,广泛适用于Web接口响应延迟、报表卡顿、高并发写入抖动等典型场景,尤其适合学生课程成绩系统、电商订单库等中等规模关系型数据

weixin_34009794的博客 475

【MySQL进阶篇】InnoDB引擎:底层结构及底层原理

全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多版本,是的读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView。

2401_83283514的博客 2437

SAP IDOC实战:如何用EDI实现跨公司采购订单自动生成销售订单(附完整配置步骤)

本文详细解析了如何利用SAP IDOC与EDI技术,实现跨公司采购订单自动生成销售订单的完整流程。通过实战案例,从业务蓝图设计、输出条件配置、伙伴参数设定到IDOC消息类型处理,提供了清晰的配置步骤与故障排查指南,帮助企业打通内部业务流,构建高效的自动化闭环。

weixin_29215815的博客 729

MySQL8底层逻辑01-建库建表底层发生了什么

通过理解InnoDB的存储架构与索引机制,研发可设计高效数据结构,运维能精准定位性能瓶颈,真正掌控数据库核心行为。当索引页写满时(默认15/16填充率),分裂为两页并移动部分行,同时更新父节点指针。:二级索引显著增加插入成本(需维护额外B+树结构):B+树分裂过程可视化。

老韩的Linux云计算架构师进阶之路 899

机器学习教程 之 半监督学习 Co-training 协同训练 (论文、算法、数据集、代码)

这篇博客介绍的是一篇用于半监督分类问题的方法: 协同训练 Co-training, A. Blum and T. Mitchell, “Combining labeled and unlabeled data with co-training,” in Proc. of the 11th Annual Conf. on Computational Learning Theory, 1998.,这算是半监督领域里面始祖级的论文了,是1998年两位CMU大佬提出的方法。 之前还写过一篇关于Tri-trainin

冯良骏 的 博客 1万+

避坑指南:处理A股通达信分时数据转日K线时,你可能会遇到的3个时间戳问题

本文针对量化交易中处理A股通达信分时数据转日K线时的常见时间戳问题,提供了专业解决方案。重点解析了午休时段处理、Pandas重采样参数设置及CSV读取时的日期解析陷阱,帮助开发者避免数据预处理错误,提升策略回测准确性。适用于Python量化交易开发者。

weixin_42549496的博客 290

MySQL 逻辑备份工具 mysqldump 工作原理深度剖析

在 MySQL 数据库备份场景中,mysqldump 作为经典的逻辑备份工具,凭借跨平台兼容性强、备份文件可读性高的优势被广泛应用。本文将从备份类型差异入手,通过实战实验拆解 mysqldump 的备份与恢复流程,揭秘其底层工作逻辑。

专注Java和MySQL领域知识分享 1179

nRF52832——大量数据传输时导致蓝牙断开连接,且无法被搜索到的解决方案(广播参数的设置、程序设计方法)

有时蓝牙通信单次发送数据量较大,且连续发送多次的时候,你会发现蓝牙就会出现异常,可能运行30min,40min,或者1h后,蓝牙就不能传输数据了,且无法被搜索到,用主机扫描蓝牙时可能会提示类似这样的DEBUG信息:bta_gattc_mark_bg_conn unable to find the bg connection mask for bd_addr=xx:xx:xx:xx:xx:xx。

数字世界 万物互联 2008

MySQL InnoDB存储引擎-逻辑存储结构与架构

Buffer Pool:缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,不会直接操作磁盘写入,而是先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。General Tablespaces:通用表空间,需要通过 CREATE TABLESPACE 语法创建通用表空间,在创建表时,可以指定该表空间。log),默认大小为16MB,日志缓冲区的日志会定期刷新到磁盘中。存储用户创建的临时表等数据。

verifier的博客 821

UniApp 覆盖安装后首次进入 APP pages.json 不生效的解决方案

通过以上步骤,解决了缓存问题导致的首次加载异常。此方案的关键在于强制更新文件名,从根本上避免旧缓存的干扰。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 689

4.Simulink基础建模操作——加减乘除运算

加减乘除运算

FPGA/MATLAB学习教程/源码/项目合作开发 9553

MySQL主从同步故障深潜:从日志停滞到1032报错的全方位解析

在数据库运维的日常工作中,主从复制环境的稳定运行是保障业务高可用的基石。然而,当同步机制出现异常时,往往会引发一连串连锁反应——从磁盘空间告警到数据一致性质疑,每一项都足以让DBA神经紧绷。从库同步失败为何会导致binlog清理停滞?报出1032错误该如何应对?希望通过故障现象、原理剖析到解决方案的全过程记录,能为你的数据库运维工作提供一份实用的参考手册。MySQL主从复制环境的故障,往往不是孤立的技术问题,而是多个机制相互影响的结果。表象是磁盘告警——源于同步失败后的日志清理停滞。

学亮编程手记 503

抓包工具:Fiddler下载、安装、使用 教程

文章目录抓包工具:Fiddler下载、安装、使用 教程一、Fiddler 下载二、Fiddler 安装三、Fiddler 使用3、Statistics 请求的性能数据分析4、Inspectors 查看数据内容5、AutoResponder 允许拦截指定规则的请求6、Composer 自定义请求发送服务器7、Filters 请求过滤规则8、Timeline 请求响应时间9、Fiddler 设置解密HTTPS的网络数据10、Fiddler 内置命令与断点 抓包工具:Fiddler下载、安装、使用 教程 Fidd

Sumarua的博客 17万+
上一篇: 来看看你是不是真的了解 RSA 加密算法,查漏补缺!
下一篇: 详解 Redis 持久化之掌握 RDB ⽂件的格式,学习如何制作数据库镜像
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值