mysql 一条语句的执行流程

文章目录

    • 一条查询语句的执行流程
      • 连接器
        • 管理连接
        • 权限校验
      • 分析器
      • 优化器
        • 采样统计
        • 优化器选错索引改正
      • 执行器
      • 查询缓存
      • 存储引擎
    • 一条update语句的执行流程
      • redo log
        • redo log buffer结构
        • redo log日志类型
        • 写入时机
        • 配置innodb_flush_log_at_trx_commit
      • binlog
        • redo log和binlog 对比
        • 配置
      • 两阶段提交协议
        • 崩溃时机

一条查询语句的执行流程

在这里插入图片描述

连接器

连接器:管理连接、权限校验

管理连接

管理连接:由于连接成本高,连接池会复用连接。

成本高:TCP三次握手;发起系统调用;高并发场景可能耗尽文件资源描述符;

复用连接的问题(长连接问题):连接在断开时才会释放占用资源,而不是用完就释放;长连接可能导致占用内存变大,比如大的查询;长时间积累会导致mysql被系统杀掉OOM // 现象:mysql重启

长连接问题解决方案:

  • 定期断开连接
  • mysql_reset_connection 重置

空闲连接最大空闲时间:wait_timeout=default 8h

权限校验

到权限表中查找拥有的权限;之后这个连接验证的全局权限用的都是此时的权限快照;即使后续修改权限,也只会在新会话中生效,不会改变当前会话; // 但db权限修改了,就会生效,但如果进入了use db1;那修改了也不会改变use db1里的会话。

分析器

分析器:词法分析、语法分析

词法分析:检查表、列是否存在;若列不存在,则返回报错

语法分析:比如 elect * from t; 会报语法错误;错误会在use near后面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优化器

优化器:多条执行计划成本对比,智能选择索引

成本对比:对比CPU计算、内存消耗、大概扫描行数(采样统计)、是否排序、是否使用临时表等

采样统计

一个索引上不同值(基数)越多,区分度越高;mysql通过采样统计得到索引的基数;

innodb_status_persistent

on 持久化 N=20(采样页数)M=10(1/10个页数变动就重新采样)

off 仅存在内存 N=8 M=16

优化器选错索引改正
  • 扫描行数不准:analyze table t修正
  • force index 强制修改索引
    • 问题:不优雅、维护字段变动就需要手动修改、迁移数据库可能语句不兼容 // 主要就是关注变更的及时性
  • 修改sql语义
  • 业务思考,删掉有影响的无效索引

执行器

执行前会判断有无操作表的权限;在进优化器前会先precheck(粗检查),执行器进行细检查,比如视图、存储过程等复杂对象在precheck检查不了。

存储过程举例:

delimiter ;;
create procedure idata()
begin...
end ;;
delimiter ;

走查询缓存时,也会先查权限;

查询缓存

失效频繁:表更新时,所有查询缓存都会被清空;更新压力大的数据库缓存命中率低;

查询缓存适合静态表,比如系统配置表;

存储引擎

比如innodb,存储引擎以插件的方式加入

一条update语句的执行流程

update t set c=c+1 where ID=2;

server层执行流程与select相同,下面主要介绍引擎层的执行流程 // 部分流程节点不在引擎中,比如binlog

在这里插入图片描述

redo log

redo log buffer结构

redo log buffer类似go ring buffer, 是固定大小的环状结构。write_pos是当前记录的位置,write_pos到check_point的绿色部分还能写入,其余位置是新的写入。如果write_pos追上check_point,就需要先落盘,更新check_point的位置。// 此时落盘是prepare状态的redo log

redo log一般有4GB,由4个1GB的文件组成。如果redo log设的太小,会出现磁盘压力小,但数据库出现间歇性的性能下跌,因为系统频繁的中断业务刷脏,更新check point位置

redo log日志类型

redo log是物理日志,记录了数据页的具体修改,比如哪一行的那个字段由啥改成啥;

redo log记录的是操作,而不是数据本身,数据存在内存(buffer pool)和磁盘上;

写入时机

redo log在修改数据前顺序写入,是WAL(Write Ahead Log),是崩溃恢复的重要保证机制;

redo log是顺序写入,比直接写入磁盘更快(磁盘I/O慢、写B+树),降低了服务崩溃,数据丢失的风险。

配置innodb_flush_log_at_trx_commit

0:只写到buffer中(内存缓存),等待定时刷新

1:事务提交时持久化到磁盘 // 推荐

2:会推到page cache中(os缓存),定时持久化

binlog

redo log怎么找到对应的binlog:有个xid,关联他们。

mysql有全局变量global_query_id,每次执行语句会给它发一个query_id,然后把这个变量+1。如果这个语句是事务的第一条语句,就会把这个query_id给xid。每次sql重启都会清空global_query_id 。

redo log和binlog 对比
redo logbinlog
物理日志逻辑日志,有三种格式,比如statement记录的就是sql语句
innodb引擎特有,用于崩溃恢复mysql上的归档日志,主要用于主从复制
循环写入顺序追加记录,追加写不会覆盖
配置

sync_binlog:

0:就写到binlog buffer中,等待定时刷新

1:事务提交立即刷新 // 推荐

N:提交累积N个后刷新

两阶段提交协议

两阶段提交协议保证了redo log和binlog的一致性;

崩溃时机

在流程图的时机A崩溃:redo log处于prepare状态,未写入binlog: 服务重新启动时,认为事务提交失败,回滚事务

在流程图的时机B崩溃:redo log处于prepare状态,写入binlog完成:服务重新启动时,认为事务提交成功,回放事务,将redo log prepare状态改为commit

在流程图的时机C崩溃: redo log若处于prepare状态,同时机B;若处于commit状态,则完成事务;

WAL保证了崩溃数据不丢失,prepare状态的引入,保证了事务提交的一致性。

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

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

相关文章

【视频观看系统】- 需求分析

🎯 一、项目目标 构建一个功能完备的视频观看网站,用户可以上传、浏览、观看视频,并在观看过程中实时发送/接收弹幕。系统具备良好的性能、可扩展性与用户体验,未来可逐步扩展为多媒体平台。👤 二、用户角色分析用户类…

模型驱动的架构MDA的案例

在一个企业资源规划(ERP)系统开发项目中,目标是为一家中型制造企业打造一套高效且可扩展的管理系统,涵盖订单处理、库存管理等多个业务模块。项目团队采用了 MDA 的设计思想进行开发。​首先是业务需求分析与计算独立模型&#xf…

第一次搭建数据库

本文详细介绍第一次搭建数据库安装和配置过程, 包括卸载旧版本、下载安装、配置服务、环境变量等等 第一步下载mysql 在下载之前需要检查电脑上有没有安装mysql, 如果有再安装, 80%就会有问题 检查方法: 电脑-右键找到管理-服务-在服务中找有没有mysql服务若有请先 1.停止服务 …

洛谷题解 | UVA1485 Permutation Counting

目录题目描述题目思路AC 代码题目描述 https://onlinejudge.org/external/14/p1485.pdf 题目思路 dp。 定义 dpi,jdp_{i,j}dpi,j​ 为前 iii 个数的排列中恰好有 jjj 个小于号的排列总数。 考虑将数字 iii 插入到前 i−1i-1i−1 个数的排列中不同的位置: 如果…

飞算科技:以原创技术赋能电商企业数字化转型

在电商行业从流量竞争迈向精细化运营的当下,技术能力已成为决定企业生存与发展的核心要素。然而,高并发场景下的系统稳定性、个性化推荐算法的迭代效率、营销活动的快速响应等挑战,让许多电商企业陷入“技术投入大、见效慢”的困境。作为国家…

人工智能自动化编程:传统软件开发vs AI驱动开发对比分析

人工智能自动化编程:传统软件开发vs AI驱动开发对比分析 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量…

用java实现一个自定义基于logback的日志工具类

✅ 动态创建: 无需配置文件,通过代码动态创建logback日志对象 ✅ Class对象支持: 使用LogUtil.getLogger(MyClass.class)的方式获取日志 ✅ 日期格式文件: 自动生成info.%d{yyyy-MM-dd}.log格式的日志文件 ✅ 文件数量管理: 只保留最近3个文件,自动删除历…

面试现场:奇哥扮猪吃老虎,RocketMQ高级原理吊打面试官

“你了解RocketMQ的高级原理和源码吗?” 面试官推了推眼镜,嘴角带笑,眼神里透着一丝轻蔑。 奇哥笑而不语,开始表演。面试场景描写 公司位于高楼林立的CBD,电梯直达28楼。面试室宽敞明亮,空气中混着咖啡香与…

Django Nginx+uWSGI 安装配置指南

Django Nginx+uWSGI 安装配置指南 引言 Django 是一个高级的 Python Web 框架,用于快速开发和部署 Web 应用程序。Nginx 是一个高性能的 HTTP 和反向代理服务器,而 uWSGI 是一个 WSGI 服务器,用于处理 Python Web 应用。本文将详细介绍如何在您的服务器上安装和配置 Djang…

外设数据到昇腾310推理卡 之二dma_alloc_attrs

目录 内核源码及路径 CONFIG_DMA_DECLARE_COHERENT DTS示例配置 dma_direct_alloc 特殊属性快速路径 (DMA_ATTR_NO_KERNEL_MAPPING) 主体流程 1. 内存分配核心 2. 地址转换 3. 缓存一致性处理 映射 attrs不同属性的cache处理 cache的标示(ARM64&#xff0…

Java 大视界:基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(2025 实战全景)

​​摘要​​在“双碳”战略深化落地的 2025 年,城市能源管理面临 ​​实时性​​、​​复杂性​​、​​可决策性​​ 三重挑战。本文提出基于 Java 技术栈的智慧能源管理平台,融合 ​​Flink 流处理引擎​​、​​Elasticsearch 实时检索​​、​​ECh…

微信小程序控制空调之微信小程序篇

目录 前言 下载微信开发者工具 一、项目简述 核心功能 技术亮点 二、MQTT协议实现详解 1. MQTT连接流程 2. 协议包结构实现 CONNECT包构建 PUBLISH包构建 三、核心功能实现 1. 智能重连机制 2. 温度控制逻辑 3. 模式控制实现 四、调试系统实现 1. 调试信息收集…

spring boot 详解以及原理

Spring Boot 是 Spring 框架的扩展,旨在简化 Spring 应用的开发和部署。它通过自动配置和约定优于配置的原则,让开发者能够快速搭建独立运行的、生产级别的 Spring 应用。以下是 Spring Boot 的详细解析和工作原理: 一、Spring Boot 的核心特…

3.4 ASPICE的系统架构与设计过程

ASPICE(Automotive SPICE)在系统架构与设计过程中,强调了在汽车软件开发中确保系统稳定性、可靠性和安全性的重要性。以下是ASPICE在系统架构与设计过程中的主要内容和步骤:系统架构设计准备阶段:需求分析:…

自助KTV选址指南与优化策略

选址四大铁律(硬性条件)产权合规:纯商业产权消防双通道:必须通过消防验收远离敏感区:距居民区、学校、医院等200米以上面积达标:满足包厢规划需求选址核心逻辑(优先级排序)要素关键策…

深度学习11(调参设参+批标准化)

调参技巧对于调参,通常采用跟机器学习中介绍的网格搜索一致,让所有参数的可能组合在一起,得到N组结果。然后去测试每一组的效果去选择。 假设我们现在有两个参数 α:0.1, 0.01, 0.001β:0.8, 0.88. 0.9这样会有9种…

Python 中 enumerate(s) 和 range() 的对比

一、enumerate(s) 是什么?for i, c in enumerate(s):...enumerate(s) 是一个内置函数,用于在遍历可迭代对象时,同时获得元素的索引和值。它返回的是一个**(index, element)** 元组。常用于遍历字符串、列表、元组等时,如果你既想拿…

【一起来学AI大模型】RAG系统流程:查询→向量化→检索→生成

RAG(Retrieval-Augmented Generation)系统核心流程非常精准: 查询 → 向量化 → 检索 → 生成 这是 RAG 实现“知识增强”的关键路径。下面我们结合具体组件(如 ChromaDB、LangChain 检索器)详细拆解每个步骤&#xff…

图像硬解码和软解码

一、什么是图像解码? 图像解码是指将压缩编码(如 JPEG、PNG、WebP、H.264/AVC、H.265/HEVC 等格式)的图像或视频数据还原为原始像素数据(如 RGB、YUV)的过程。 解码可以在CPU(软件解码)或专用硬…

Camera2API笔记

1. 常用对象CameraManager 相机服务。用于获取相机对象和相机信息。CameraDevices 相机设备。负责连接相机、创建会话、生成拍摄请求,管理相机生命周期。CameraCaptureSession 相机拍摄会话。用于预览和拍摄。一个相机只能有一个活跃会话。打开新会话时,…