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

MySQL最佳实践

一、MySQL查询执行过程

1.MySQL分层结构

在这里插入图片描述

  • MySQL8.0没有查询缓存的功能了,如果频繁修改缓存,将会损耗性能
  • 查询流程就按照分层结构就可以清楚,只要了解各个组件的各自功能就行
  • 分析器主要分析语法和词法是否正确
  • 优化器主要优化SQL语句

二、MySQL更新执行过程

  • 更新主要涉及两个重要的日志,redolog(重做日志)和binlog(归档日志)

1.redolog

  • 如果没有日志记录的话,每一条更新语句将会写进磁盘,再从磁盘找到对应的数据进行更新,将会非常损耗性能
  • InnonDB引擎会先更新内存,再写redolog日志,等系统空闲的时候,再将redolog日志写入磁盘.即使数据库宕机,恢复后也能将未写入磁盘的redolog写入磁盘,保证数据更新这就是InnoDB提供的crash-safe能力
  • redolog是固定大小的文件,如果日志文件不够写,将会先擦除一部分再写

2.binlog

  • binlog是server层提供的归档日志,会记录下更新的逻辑,比如将1变为2

3.两种日志区别

  • redolog是InnoDB提供的,支持crash-safe能力;binlog是server层提供的
  • redolog是循环写的,日志文件会用完;binlog是追加写的

4.更新过程

示例:给ID=2的C字段加1

  • 查找ID=2的数据,如果内存有直接返回,没有则从磁盘查找,再返回给内存
  • 将ID=2的C字段+1,将数据更新到内存
  • 将记录写入redolog,此时redolog处于prepare状态
  • 告知执行器可以提交事务,写binlog日志
  • redolog提交事务,更新完成

(1)两阶段提交

为什么会两阶段提交redolog和binlog呢,原因就是为了误删数据后,恢复数据能与历史数据达成一致.我们可以进行反证

  • 假设先提交redolog,当发生了一次crash-safe,恢复后redolog记录的日志可以更新数据,但是binlog没有记录.之后使用binlog恢复删除的数据,会造成该条数据不一致
  • 假设先提交binlog后crash,但是redolog并没有记录该条数据的更新,所以机器恢复后redolog不会更新该条数据,但是使用binlog恢复删除的数据则会更新该条数据,也会造成数据不一致
http://www.lryc.cn/news/12726.html

相关文章:

  • Python 之 Matplotlib 散点图、箱线图和词云图
  • SpringCloud(三)Hystrix断路器服务降级、服务熔断、服务监控案例详解
  • 【超好用】自定义的mybatis-plus代码生成器
  • Kubernetes学习笔记-计算资源管理(4)监控pod的资源使用量20230219
  • 游戏开发 - 开发流程 - 收集
  • LA@向量空间@坐标变换
  • JSP脚本指令及标记学习笔记
  • 【C语言每日一题】——猜凶手
  • 2019蓝桥杯真题完全二叉树的权值 C语言/C++
  • 大数据之Phoenix环境搭建
  • 62 一次 Promotion failed 的调试
  • Git的基本操作
  • LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
  • 测试1:测试相关概念
  • 2.19 索引和事务
  • 算法导论【摊还分析】—聚合分析、核算法、势能法
  • 【LeetCode】剑指 Offer 08. 二叉树的下一个节点 p65 -- Java Version
  • Python 之 Pandas Series 数据结构
  • 【java基础】Java常用类———包装类
  • linux shell 入门学习笔记3 shebang
  • 写作小课堂:简历模版【A4纸正反两面】(20230219)
  • 一文搞懂 DevOps
  • 深入讲解Kubernetes架构-租约
  • 微信小程序学习第11天——Vant Weapp组件库、API Promise化、全局数据共享Mobx、分包
  • Python3-基本数据类型
  • RPA落地指南:什么是RPA
  • 跨域问题的三种解决办法
  • c++提高篇——string容器
  • [软件工程导论(第六版)]第6章 详细设计(复习笔记)
  • RabbitMQ核心内容:实战教程(java)