跳至主要內容
行锁的加锁规则
本文内容

前言

上一篇文章 中,介绍了 MySQL 中的锁类型,其中行级锁分为 Record Lock、Gap Lock 和 Next-Key Lock,那一条 SQL 语句要加行级锁时,应该加那个锁?具体是怎么加的呢?本文就来讲讲 MySQL 行级锁的加锁规则是怎样的。


AruNi_Lu大约 11 分钟数据库MySQL
undo log:世上真有后悔药
本文内容

1. 为什么需要 undo log?

InnoDB 存储引擎是支持事务的,而事务有一个非常重要的特征是 原子性,即事务中的所有操作,要么全部完成,要么全部失败。

但是,在实际运行过程中,就会有出现某个 事务执行到一半 的情况,例如:

  • 事务执行过程中 出现错误,如实例崩溃、突然断电宕机等;

  • 开发人员在事务执行过程中手动执行 ROLLBACK 语句结束当前事务。

  • 还有 两阶段提交时,在某时刻崩溃后,如果 binlog 还未刷盘,则要回滚这个事务


AruNi_Lu大约 4 分钟数据库MySQL
两阶段提交有什么问题
本文内容

1. 两阶段提交的问题

select 执行流程 中,讲到了可以利用两阶段提交解决 redo log 和 binlog 一致性的问题。但是有两阶段提交有一个明显的问题,就是性能很差。主要体现在两个方面:


AruNi_Lu大约 8 分钟数据库MySQL
binlog:主从复制和备份
本文内容

1. 什么是 binlog?

之前学习的 redo log,是属于 InnoDB 存储引擎层的,MySQL 的 Server 层 也有自己的日志,称为 binlog(归档日志)。

binlog 记录的是 全量日志,写完一个文件就会写下一个文件,所以 binlog 里有数据库的所有数据信息,非常适合用来做 备份和主从复制


AruNi_Lu大约 7 分钟数据库MySQL
提高缓存命中率的 LRU 链表
本文内容

1. 缓冲区不够了怎么办?

在上一篇文章中我们知道,为了提高数据库的读写性能,InnoDB 建立了一个缓冲区 Buffer Pool。Buffer Pool 被划分为多个缓冲页,这些缓冲页通过链表(链表中保存的是控制块)来管理。

在 Buffer Pool 中,常用的链表有 free 链表、flush 链表,还有一个就是我们今天的主角 — LRU 链表

缓冲区的大小是有限的,那么当 缓冲区的内存不足时,就需要淘汰一些旧的缓冲页,再来存放新的。这个事情,就由 LRU 链表负责。


AruNi_Lu大约 8 分钟数据库MySQL
了解 Buffer Pool
本文内容

1. 为什么需要 Buffer Pool?

我们都知道,MySQL 中的数据都是放在 磁盘 上的,凡是跟磁盘打交道,基本上都需要在内存中建立 缓存,因为磁盘的读写速度非常慢。

例如,Linux 在内存和磁盘之间就建立了一个缓冲区 Buffers,主要有两个 好处

  • 写操作时,如果 Buffers 中有该页,则直接在 Buffers 中写,如果没有则将该页先读入 Buffers,再在 Buffers 中写,后续再统一写回磁盘。也就是 将小量多次的写磁盘操作转换成了大量少次,大大提升了写的效率;
  • 读操作时,因为 Buffers 中就是最新的数据,所以可以直接从 Buffers 中读取,而不用到低速的磁盘上读,也大大提升了读的效率;

AruNi_Lu大约 9 分钟数据库MySQL
MySQL 中的锁
本文内容

1. MySQL 中的锁有哪些

根据加锁的范围,MySQL 中的锁分为 全局锁、表锁和行级锁

全局锁和表级锁是在 Server 层实现的,而行级锁是在存储引擎层实现的。

2. 全局锁

2.1 什么是全局锁

全局锁,顾名思义会对整个 MySQL 实例加锁,也就是锁库中所有的表。


AruNi_Lu大约 17 分钟数据库MySQL
kv 数据库如何实现
本文内容

前言

我们都知道,Redis 是一个典型的 kv 数据库,即数据都是以 key-value 的形式来存储的。那么一个简单的 kv 数据库是如何实现的,它又包含什么内容呢?

Redis 是比较复杂的,它发展至今已经属于一个比较完善的 NoSQL 了,其中包含的模块也比较多,如果我们一开始学习 Redis 就往某个模块里钻,很容易找不到方向。

所以,我们先来简单的了解一下 kv 数据库是如何实现的,它应该包含哪些功能模块,然后再引申到 Redis。先做到纵览全局,再去细扣某个功能模块的实现,会得心应手很多。


AruNi_Lu大约 9 分钟数据库Redis
2