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

news2024/11/23 19:11:49

背景及目录:

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

一.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

pyinstaller 操作以及常见问题解决

最近有需要用pyinstaller打包 直接上命令: pyinstaller -F xxx.py -w -i img.ico-F 指定需要打包的主文件,-w是让打包后的exe,运行不再出现cmd框,一般打包都会加上,-i 是指定打包后的图标ico文件 在线生成ico链接&am…

(14)点云数据处理学习——RGBD 里程计

1、主要参考 (1)官网 RGBD Odometry — Open3D 0.16.0 documentation 2、原理和实现 2.1 RGBD Odometry主要作用 RGBD里程计在两个连续的RGBD图像对之间查找相机运动。输入是RGBDImage的两个实例。输出是刚体变换形式的运动。Open3D实现了[Steinbruc…

Transformer——台大李宏毅详讲Transformer

文章目录李宏毅老师讲TransformerEncoderDecoderDecoder整体逻辑non-autoregressiveDecoder中的Cross Attention训练Seq2seq的一些Tips老师讲的超级棒,激动哭了: 视频链接:台大李宏毅21年机器学习课程 self-attention和transformer 李宏毅老师…

Mac版Word设置从第K页开始显示页码

tags: Word Tips 写在前面 最近有同学问我怎么在word文档中从第四页开始设置页码, 也就是首页以及第二页第三页的说明页都不编页码, 从第四页开始页码为1, 然后往后编号这种. 一开始我以为直接在页码设置处就有这个选项的(毕竟写东西几乎不用word, 也不熟悉), 后来发现还是t…

从Unity Robotics Hub入门Unity-ROS

0.简介 对于Unity而言,其拥有非常完备的物理特性,这对于机器人仿真是非常有用的,但是实际上Unity和ROS之间的通信一直是摆在两者之间的难题,正好看到宇宙爆肝锦标赛冠军写的这个系列,所以个人想参照为数不多的资料来进…

2022年创新药行业研究报告

第一章 行业概况 创新药,也称为原研药,是一个相对于仿制药的概念,指的是从机理开始源头研发,具有自主知识产权,具备完整充分的安全性有效性数据作为上市依据,首次获准上市的药物。新药上市要经历化合物的发…

学个Antenna:Matlab天线工具箱知多少(二)

学个Antenna是以天线仿真和调试为主,理论原理为辅的干货天线技术专栏,包括天线入门知识以及各类天线的原理简介、仿真软件建模、设计、调试过程及思路。如有想看到的内容或技术问题,可以在文尾写下留言。 ​摘要: 上节推文学个Ant…

A-Level商务例题解析及练习Sources of finance

今日知识点:Sources of finance 例题 Q: Discuss the benefits and drawbacks to a business of using only internal sources of finance to fund expansion. 解析 Answers could include:Outline of types of internal funding sources, such as building up rese…

我与足球以及世界杯的过往

中东土豪卡塔尔斥资2000亿举办的世界杯正在如火如荼的进行中,我也是几乎一场不落的看完了每一场的比赛直播【最近都没怎么更文。。。】,目前小组赛已经结束,我们也见证了很多球星的落寞背影与不甘,也见证了新星的天赋与成长&#…

E语言基本特征码/时钟反调试/窗体push大法

E语言基本特征码/时钟反调试/窗体push大法 该篇文章有以下内容: 1. 易语言字符串比较函数 test edx,3 F7C203000000 2. 按钮事件特征码:FF55FC5F5E,可以被修改恒成立 3. 易语言体 FF 25 4. 时钟的反调试 5. Push窗体大法 一、利用 test…

Qt-FFmpeg开发-音频解码为PCM文件(9)

Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 文章目录Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm)1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容👉个人内容分类汇总 &#x…

关于 registerForActivityResult()的使用方法,不能说详细,只能说略懂得例子

目录 1.情况说明 2.registerForActivityResult()的使用方法 1.情况说明 startActivityForResult();函数过时 使用了 registerForActivityResult()进行了代替 2.registerForActivityResult()的使用方法 数据来源 (2条消息) registerForActivityResult()的使用方法例子_发狂…

西北工业大学算法实验机试复习

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

TC申请是否需要银行转账记录?

【TC申请是否需要银行转账记录?】 答案是毫无疑问的。 根据TE官网公开的文件CCS Certification Procedures V3.0 里面关于TC申请所需的文件指引E2.1.1f:(如图) 企业在申请与TE相关的认证项目(例如GRS/RCS等等&#xf…

iptables 命令和 iptables.service 服务 有什么关系 ?

写在前面 关于iptables 命令 和 iptabls.service 的一些疑惑理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去&…

企业级大数据平台智能运维好帮手——星环科技多模数据平台监控软件Aquila Insight

Aquila Insight介绍 Aquila Insight是星环科技推出的一款多模数据平台监控软件,为企业运维团队提供了一套统一、完整、便捷的智能化运维解决方案。通过丰富的仪表盘管理、告警与通知管理、实时和历史查询语句运行分析、计算和存储引擎的统一监控、完整的日志收集过滤…

编程内功心法「底层原理系列」 回归与本质,让本文带你认识什么是计算机软件系统

前提概要 如果希望可以把计算机编程技术提升到另外一个高度,,那么想要搞清楚什么是软件设计,首先就要理解什么是计算机软件,在这之后,再去考虑为什么对软件进行设计,以及在通常情况下应该怎样设计软件。 什么是计算机…

计算机毕业设计:基于HTML学校后台用户登录界面模板源码

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

KT148A语音芯片SOP外挂功放芯片8002D的说明_V1

目录 一、简介 KT148A语音芯片内置8欧姆0.5W的功放,所以一般的应用场景,播放一些提示音音量是足够的。但是有的需求还需要驱动更大的扬声器,实现更大的播放音量,这里我们给出解决方案。KT148AHAA8002D的组合 二、硬件电路如下-K…