当前位置: 首页 > news >正文

mysql的 order by是怎么工作的?redo-log和binlog为什么采用双确认机制?

前言

一、order by 是怎么工作的?
二、redo-log和binlog为什么采用双确认机制
一、完整正常事务提交流程(主库)
各个节点宕机会怎么样?

  1. redo log prepare 之前宕机
  2. redo log 刷盘后宕机 没写binlog
  3. binlog刷盘成功,但是redo log 未commit就宕机了
  4. commit之后宕机
    加入主从复制后的完整流程(非常重要)
    主库已提交,但binlog未同步到从库
    从库执行 relay log 中途宕机
    把所有角色放在一张总览图(终极版)

mysql的 order by是怎么工作的?redo-log和binlog为什么采用双确认机制?

  • 前言
    • 一、order by 是怎么工作的?
    • 二、redo-log和binlog为什么采用双确认机制
      • 一、完整正常事务提交流程(主库)
      • 各个节点宕机会怎么样?
        • 1. redo log prepare 之前宕机
        • 2. redo log 刷盘后宕机 没写binlog
        • 3. binlog刷盘成功,但是redo log 未commit就宕机了
        • 4. commit之后宕机
      • 加入主从复制后的完整流程(非常重要)
        • 主库已提交,但binlog未同步到从库
        • 从库执行 relay log 中途宕机
      • 把所有角色放在一张总览图(终极版)

一、order by 是怎么工作的?

order by排序:通过索引获取所有符合条件的数据,然后放到sort_buff中进行排序。

如果需要查询的字段太长,可以通过配置项配置大小边界。

那么就会先获取排序字段和主键字段 然后sort_buff中排序,然后再去查表 获取完整结果。优化的方式可以通过在排序字段上建立索引(索引是有序的)来减少排序,通过建立覆盖索引,来减少回表

二、redo-log和binlog为什么采用双确认机制

为了保证事务的原子性+崩溃后恢复后的一致性,避免数据和日志的不一致性。

双确认机制,只有当两个日志都写入成功之后,事物才会真正的提交。

一、完整正常事务提交流程(主库)

┌────────────────────┐ │ 客户端发送 SQL │ └─────────┬──────────┘ │ ▼ ┌──────────────────────────┐ │InnoDB执行 SQL(改内存) │ │BufferPool│ └─────────┬────────────────┘ │ ▼ ┌──────────────────────────────────┐ │ 生成 redo log(PREPARE) │ │ redo log buffer │ └─────────┬────────────────────────┘ │ ▼ ┌──────────────────────────────────┐ │ redo log 刷盘(fsync) ✅ │ │ 【阶段一:Prepare】 │ └─────────┬────────────────────────┘ │ ▼ ┌──────────────────────────────────┐ │ 生成 binlog(事务事件) │ │ binlog cache │ └─────────┬────────────────────────┘ │ ▼ ┌──────────────────────────────────┐ │ binlog 刷盘(fsync) ✅ │ │ 【binlog 持久化】 │ └─────────┬────────────────────────┘ │ ▼ ┌──────────────────────────────────┐ │ redo log 写 COMMIT+刷盘 ✅ │ │ 【阶段二:Commit】 │ └─────────┬────────────────────────┘ │ ▼ ┌────────────────────┐ │ 事务提交成功返回 OK │ └────────────────────┘

刷盘:是指的从内存写入磁盘的操作,图中第一次 redo log 刷盘(fsync)是把redo log文件写到磁盘。刷盘的主要目的是防止崩溃后数据丢失。

当阶段二 Commit后,返回事物提交成功的同时,会异步把数据写入到.ibd文件中。

各个节点宕机会怎么样?

1. redo log prepare 之前宕机

事物没有开始 直接丢弃

2. redo log 刷盘后宕机 没写binlog

恢复流程:

扫描 redo log >发现PREPARE > 检查 binlog 不存在 >回滚事物

3. binlog刷盘成功,但是redo log 未commit就宕机了

扫描 redo log >发现PREPARE > 检查 binlog 存在 >补写redo log commit > 事物成功

4. commit之后宕机

扫描redo log > 发现commit 直接恢复

加入主从复制后的完整流程(非常重要)

Slave SQL Thread ↓ 读取 relay log ↓ 执行 SQL / 行事件 ↓ 生成 redo log ↓ redo log 刷盘 ↓ 数据落盘
主库已提交,但binlog未同步到从库

这是主从延迟,不是数据错误

从库执行 relay log 中途宕机

relay log 在
redo log 未 commit

恢复:

  • 从库根据 redo log 回滚/重做
  • 再继续执行 relay log

把所有角色放在一张总览图(终极版)

Client │ ▼ Master InnoDB │ redo log (prepare → commit) │ ▼ Master binlog ───────► Slave IO Thread │ ▼ relay log │ ▼ Slave SQL Thread │ ▼ Slave redo log │ ▼ Slave 数据文件

http://www.jsqmd.com/news/146126/

相关文章:

  • PaddlePaddle镜像能否用于智能家居语音助手开发?
  • PaddlePaddle镜像中的模型解释性工具SHAP集成方法
  • 一文说清 Raspberry Pi Imager:烧录工具的核心功能全解析
  • PCB设计规则基础篇:手把手带你完成首次实践
  • eSPI主控制器在自动化网关中的部署:从零实现
  • 零基础搭建ESP32开发环境(Arduino IDE)
  • PaddlePaddle镜像如何对接外部数据库进行批量推理?
  • UVC 红外相机初始化流程 setup包解析
  • 树莓派因网络超时导致更新出错的项目应用解析
  • Windows_Hello_Configuration_Analysis Windows Hello 配置过程分析 setup包分析
  • 【毕业设计】SpringBoot+Vue+MySQL 客户管理系统平台源码+数据库+论文+部署文档
  • ESP32运行压缩大模型的时延优化方案
  • 前后端分离辽B代驾管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 树莓派安装拼音输入法:小白指南从配置到使用
  • PaddlePaddle镜像中的异步推理机制实现方式详解
  • 基于esptool的AES加密烧录实战案例详解
  • 基于SpringBoot+Vue的旅游管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • PaddlePaddle镜像训练中断恢复机制:Checkpoint保存策略
  • Arduino环境下ESP32项目音频输出功能探索教程
  • 【2025最新】基于SpringBoot+Vue的辽B代驾管理系统管理系统源码+MyBatis+MySQL
  • SpringBoot+Vue 美术馆管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 系统文件ContentDeliveryManager.Utilities.dll损坏 如何下载修复?
  • 图解树莓派系统烧录流程:新手友好型教程
  • RISC基础知识全面讲解:为后续进阶打牢根基
  • PaddlePaddle镜像能否用于时间序列预测?LSTM实战示例
  • 企业级考勤管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 外观设置 - Cordova 与 OpenHarmony 混合开发实战
  • PaddlePaddle镜像中的Tokenizer中文分词能力测评
  • 树莓派5引脚定义支持RS-485接口配置:实战案例
  • 系统文件CoreShellAPI.dll丢失如何修复?