跳至主要內容
count() 计数的几种方式
本文内容

1. count() 的实现方式

在 MySQL 中,不同的存储引擎对 count() 有不同的实现方式:

  • MyISAM 把表的总行数保存在了磁盘上,因此执行 count() 时可以直接返回,性能很高;
  • InnoDB 在执行 count() 时需要把数据一行一行地从引擎里读取出来,然后在 server 层计数统计

AruNi_Lu大约 8 分钟数据库MySQL
隔离级别的实现原理
本文内容

1. 四种隔离级别是如何实现的?

在四种隔离级别中,读未提交和串行化的实现是最简单的,基本不需要做过多的事情:

  • 读未提交:每次读取数据时,不做任何措施,直接读取最新数据 就好了,所以可以读到未提交的数据;
  • 串行化:通过加 读写锁 来避免并发访问数据,读加读锁、写加写锁,读写锁互斥,所以一个事务在读的时候,另一个事务不可进行写操作,反之亦然。

AruNi_Lu大约 8 分钟数据库MySQL
事务隔离级别
本文内容

前言

上一篇文章中,介绍了事务的基本概念、MySQL 中的事务控制语句、事务的 ACID 特性等,本文将展开其中的 I,也就是 “隔离性”。

1. 并发事务引发的问题

当一个数据库中有 多个事务在同时执行 时,可能会出现 脏读、不可重复读、幻读 的问题。下面来看看这三个问题分别是什么现象。


AruNi_Lu大约 6 分钟数据库MySQL
初识事务
本文内容

1. 什么是事务?

在 MySQL 数据库中,事务是指 对数据库表的一系列操作都是一个单独的工作单元。主要用于在批量操作多个表时,需要让这些操作成为一个独立的工作单元,保证它们要么全部执行,要么全部不执行

举个例子,现在有三个表 user、video、post,我们在删除 user 的时候,希望把该 user 的 video 和 post 一并删除,这将涉及到三个表的 delete 操作(由于 user 与 video、post 是一对多的关系,所以 video 和 post 又涉及多个 delete 操作),这三个操作就需要使用事务,否则可能出现 user 被删除,而其 video/post 没被删除的情况。


AruNi_Lu大约 5 分钟数据库MySQL
行锁的加锁规则
本文内容

前言

上一篇文章 中,介绍了 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
2