news 2026/7/4 13:58:34

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 数据文件

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 21:58:47

基于PaddlePaddle镜像的OCR流水线设计:适用于票据识别场景

基于PaddlePaddle镜像的OCR流水线设计:适用于票据识别场景 在金融、税务和物流等行业加速数字化转型的今天,每天都有海量的发票、收据、订单等纸质或扫描票据需要录入系统。传统依赖人工录入的方式不仅效率低下——一张发票平均耗时3到5分钟,…

作者头像 李华
网站建设 2026/7/3 12:24:10

ESP32-CAM图像传输协议解析:MJPG与TCP的性能对比分析

ESP32-CAM图像传输实战:MJPG与原始帧TCP的性能实测与选型指南你有没有遇到过这样的情况?调试ESP32-CAM时,画面卡顿、延迟高得离谱,甚至几秒才刷新一帧。换了个客户端还是老样子,Wi-Fi信号也不差——问题到底出在哪&…

作者头像 李华
网站建设 2026/6/26 18:26:07

es教程新手友好:配置本地开发环境步骤详解

从零开始搭建 Elasticsearch 本地开发环境:新手也能轻松上手 你是不是也曾在项目中听到“我们用的是 ELK 做日志分析”?或者面试时被问到:“你会用 Elasticsearch 写查询吗?”——如果你点头说会,但心里却在嘀咕“Ela…

作者头像 李华
网站建设 2026/7/1 22:51:39

跨平台开发效率提升:交叉编译最佳实践总结

跨平台开发效率提升:交叉编译实战指南与工程避坑全解析 你有没有经历过这样的场景? 在一块ARM开发板上跑 make 编译一个中等规模的C项目,风扇狂转、进度条爬得比蜗牛还慢——三小时后终于链接成功,结果运行时报错“非法指令”。…

作者头像 李华
网站建设 2026/6/30 16:28:46

系统缺少找不到d3d10.dll文件 如何下载修复问题?

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/7/1 16:17:34

PaddlePaddle镜像与Spark整合进行大规模特征工程尝试

PaddlePaddle镜像与Spark整合进行大规模特征工程尝试 在推荐系统、广告点击率预估和内容理解等工业级AI应用中,一个常被低估但至关重要的现实是:80%的时间花在数据准备上,而只有20%用于模型训练本身。当企业面对每天TB级的用户行为日志时&…

作者头像 李华