本文内容
1. count() 的实现方式
在 MySQL 中,不同的存储引擎对 count() 有不同的实现方式:
- MyISAM 把表的总行数保存在了磁盘上,因此执行 count() 时可以直接返回,性能很高;
- InnoDB 在执行 count() 时需要把数据一行一行地从引擎里读取出来,然后在 server 层计数统计。
在 MySQL 中,不同的存储引擎对 count() 有不同的实现方式:
在四种隔离级别中,读未提交和串行化的实现是最简单的,基本不需要做过多的事情:
前言
上一篇文章中,介绍了事务的基本概念、MySQL 中的事务控制语句、事务的 ACID 特性等,本文将展开其中的 I,也就是 “隔离性”。
当一个数据库中有 多个事务在同时执行 时,可能会出现 脏读、不可重复读、幻读 的问题。下面来看看这三个问题分别是什么现象。
在 MySQL 数据库中,事务是指 对数据库表的一系列操作都是一个单独的工作单元。主要用于在批量操作多个表时,需要让这些操作成为一个独立的工作单元,保证它们要么全部执行,要么全部不执行。
举个例子,现在有三个表 user、video、post,我们在删除 user 的时候,希望把该 user 的 video 和 post 一并删除,这将涉及到三个表的 delete 操作(由于 user 与 video、post 是一对多的关系,所以 video 和 post 又涉及多个 delete 操作),这三个操作就需要使用事务,否则可能出现 user 被删除,而其 video/post 没被删除的情况。
前言
上一篇文章 中,介绍了 MySQL 中的锁类型,其中行级锁分为 Record Lock、Gap Lock 和 Next-Key Lock,那一条 SQL 语句要加行级锁时,应该加那个锁?具体是怎么加的呢?本文就来讲讲 MySQL 行级锁的加锁规则是怎样的。
InnoDB 存储引擎是支持事务的,而事务有一个非常重要的特征是 原子性,即事务中的所有操作,要么全部完成,要么全部失败。
但是,在实际运行过程中,就会有出现某个 事务执行到一半 的情况,例如:
事务执行过程中 出现错误,如实例崩溃、突然断电宕机等;
开发人员在事务执行过程中手动执行 ROLLBACK 语句结束当前事务。
还有 两阶段提交时,在某时刻崩溃后,如果 binlog 还未刷盘,则要回滚这个事务。
在 select 执行流程 中,讲到了可以利用两阶段提交解决 redo log 和 binlog 一致性的问题。但是有两阶段提交有一个明显的问题,就是性能很差。主要体现在两个方面:
前言
在基础篇中知道了 select 语句执行的那套流程,一条 update 语句其实也会同样走一遍。
之前学习的 redo log,是属于 InnoDB 存储引擎层的,MySQL 的 Server 层 也有自己的日志,称为 binlog(归档日志)。
binlog 记录的是 全量日志,写完一个文件就会写下一个文件,所以 binlog 里有数据库的所有数据信息,非常适合用来做 备份和主从复制。