undo log详解

undo log详解

在介绍事务实现原理时候,我们简单了解过undo log,它可以帮助我们实现事务的原子性。本文把undo log拎出来,详细介绍一下。

在事务的执行过程中,可能遇到各种错误,此时为了保证事务的原子性,我们需要回滚当前事务已经执行的修改。那么怎么回滚这些修改呢?一种直接的方法就是,每次执行insert、delete、update语句时,我们都要留一手,用某种机制记录下数据修改前的样子,这样当我们需要回滚时,我们就能将修改的数据恢复原样。这就是undo log需要实现的功能。

阅读更多...

redo log详解

redo log详解

之前学习事务的时候,介绍过redo log,其核心功能就是服务器宕机后进行数据恢复。本文把它单独拎出来,详细介绍一下。

在了解Redo log更具体内容之前,我们先回答一个问题:为什么要有redo log?

学习过BufferPool,我们知道InnoDB读取/更新数据操作都是在BufferPool中进行的,在某个时间点统一将BufferPool中的脏页同步到磁盘中。但是如果系统发生故障,宕机了,BufferPool中还有脏页没来得及同步到磁盘中,这时就会发生数据丢失。

为了避免这种情况,我们就需要一种机制,保存BufferPool中数据更新的操作,在系统恢复时,帮助我们恢复宕机前没来得及同步的脏页数据。这就是redo log要完成的功能。

也就是说,对于更新操作,我们不仅要更新BufferPool中的数据,我们还要将该更新操作记录到redo log中。为了节约空间,redo log中记录的是物理页的变化。比如,某个事务将系统表空间第100号页面中偏移量为1000处的字节从1更改为2,我们只需要进行如下记录:

“将第0号表空间第100号页面中偏移量为1000处的值改为2”。

阅读更多...

MySQL的binlog

MySQL的binlog

MySQL中的日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的还要属 二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。

在“MySQL事务”一文中,介绍了重做日志和回滚日志的相关知识,包括如何通过redo log实现事务的持久性,通过undo log实现事务的原子性。本文主要介绍binlog相关知识。

阅读更多...

MySQL索引

MySQL索引

1 索引概述

索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。

索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

阅读更多...

MySQL的缓存机制

MySQL的缓存机制

本文简单总结下MySQL中的缓存机制,具体来说是,使用InnoDB作为作为存储引擎时的各种缓存机制。主要包含三个方面:

  • MySQL层——查询缓存:作用不大,高版本mysql已经去掉了这个功能。
  • InooDB层——buffer pool:很重要,是保证InnoDB高性能的核心功能之一,也是本文的重点介绍对象。
  • 三大日志文件的缓存:binglog、redolog和undolog三个日志文件,写文件时,先写到缓存,然后再刷盘。
阅读更多...

InnoDB中的MVCC

InnoDB中的MVCC

1 MVCC概述

MVCC,全称 Multi-Version Concurrency Control,即多版本并发控制。我们知道数据库并发场景有3种:

  1. 读-读:不存在任何问题,也不需要并发控制

  2. 读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读

  3. 写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失

为了在这些场景中实现事务的隔离性,避免脏读、脏写、幻读、不可重复读等现象,一种常规的操作就是加悲观锁,让事务串行执行。但是这种方式会大大削弱系统的并发能力。

多版本并发控制(MVCC)就是一种用来解决读-写冲突的无锁并发控制 。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁非阻塞并发读

阅读更多...

MySQL事务

MySQL事务

何为事务?事务即一组操作,这组操作要么都执行,要么都不执行。事务是数据库区别文件系统的重要特性之一。数据库中引入事务的主要目的在于:事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保所有修改都已经保存,或者所有修改都不被保存

阅读更多...

MySQL数据类型

MySQL数据类型

1 字段类型

1.1 整型

  • MySQL中可以表示整型数据的类型有5种:TINYINTSMALLINTMEDIUMINTINTBIGINT,分别占用1、2、3、4、8个字节。
  • 所有类型都可以设置成unsigned
  • 需要注意的是INT(11)这类描述中的“11”指的是交互工具中显示宽度为11,不会对数据占用空间和表示范围造成任何影响。
阅读更多...

一条SQL语句的执行

一条SQL语句的执行

本篇文章会分析下一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。

在分析之前我会先带着你看看 MySQL 的基础架构,知道了 MySQL 由那些组件组成以及这些组件的作用是什么,可以帮助我们理解和解决这些问题。

阅读更多...
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信