五~九(完结)
五、索引和算法
略
六、锁
lock和latch
latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB引擎中,latch又可以分为 mutex(互斥量)和 rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同),此外,lock正如在大多数数据库中一样,是有死锁机制的。
lock | latch | |
---|---|---|
对象 | 事务 | 线程 |
保护 | 数据库内容 | 内存数据结构 |
持续时间 | 整个事务过程 | 临界资源 |
模式 | 行锁、表锁、意向锁 | 读写锁、互斥量 |
死锁 | 通过waits-for graph、time out等机制进行死锁检测与处理 | 无死锁检测与处理机制。仅通过应用程序加锁的顺序(lock leveling)保证无死锁的情况发生 |
存在于 | Lock Manager的哈希表中 | 每个数据结构的对象中 |
InnoDB支持一种额外的锁方式,称之为意向锁。将锁定的对象分为多个层次,意向锁意味着希望在更细力度上进行加锁。
如果将上锁的对象看成一棵树,那么对最下层的对象上锁,首先需要对粗粒度的对象上锁。
一致性非锁定读:
在MySQL的InnoDB存储引擎中,一致性非锁定读(Consistent Non-Locking Read)是一种读取数据的方式,它不会对读取的数据加锁,因此不会阻止其他事务对这些数据进行修改。这种读取方式是通过多版本并发控制(MVCC,Multi-Version Concurrency Control)实现的。
在一致性非锁定读中,InnoDB会读取数据的最新提交版本,即使有其他事务正在修改这些数据。这样,读取操作不会等待其他事务完成,也不会阻止其他事务对数据进行修改。读取操作只会看到在读取时已经提交的数据版本,不会看到未提交的数据版本。
一致性非锁定读的优点在于它提高了并发性能,允许多个事务同时对数据进行读取和修改,而不会产生冲突。然而,由于读取操作不会看到未提交的数据版本,因此可能会读取到不一致的数据。如果需要确保读取到一致的数据,可以使用一致性锁定读(Consistent Locking Read)或者串行化(Serializable)隔离级别。
总的来说,一致性非锁定读适用于读取频繁但修改较少的情况,可以提高并发性能和吞吐量。但在需要确保数据一致性的情况下,应该使用其他读取方式或者适当的隔离级别。
一致性锁定读:显式地对数据库读取操作进行加锁以保证数据逻辑的一致性,而这要求数据库支持加锁语句,即使是对于SELECT的只读操作。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读操作:
- select ... form update
- 对读取的行记录加一个X锁,其他事务不能对已锁定的行加上任何锁
- select ... lock in share mode
- 对读取的行记录加一个S锁,其他事务可以向被锁定的行加S锁,但是如果加X锁,则会被阻塞
行锁的三种算法
- record lock:单个行记录上的锁
- gap lock:间隙锁,锁定一个范围,但不包含记录本身
- next key lock:gap lock + record lock,锁定一个范围,并且锁定记录本身
- 例如一个索引有 10,11,13,20 四个值,那么该索引可能被 next key locking 的区间为:
(-无穷,10 ]
(10,11)
(11,13]
(13,20]
(20,+无穷)
七、事务
事务分类:
- 扁平事务:最简单的一种,使用最频繁。
- 所有操作都处于同一层次,其间的操作是原子的
- 主要限制是不能提交或者回滚事务的某一部分,或者分几个步骤提交
- 带有保存点的扁平事务
- 支持扁平事务操作外,还允许事务执行过程中回滚到同一事务中较早的一个状态。保存点(savepoint)用来统治系统应该记住事务当前的状态,以便发生错误时,事务能回到保存点当时的状态
- 链事务
- 可视为保存点事务的一种变种。带有保存点的扁平事务,当发生系统崩溃时,所有保存点都将小时,因为此保存点是易失的,而非持久的。
- 思想:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。注意,提交事务操作和开始下一个事务操作将合并为一个原子操作。这意味着下一个事务将看到上一个事务的结果。
- 区别:带有保存点的扁平事务可以回滚到任意正确的保存点,而链事务的回滚仅限于当前事务,即只能回滚到最近一个的保存点。
- 嵌套事务
- 是一个层次结构框架。由一个顶层事务控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换。
- 实际的工作交由叶子节点来完成,只有叶子节点的事务才能访问数据库、发送消息、获取其他类型的资源。而高层的事务仅负责逻辑控制,决定何时调用相关的子事务。
- 分布式事务
- 在一个分布式环境下运行得扁平事务,因此需要根据数据所在位置访问网络中的不同节点
八、备份和恢复
备份方法的不同分类:
- 热备份(在线备份)
- 在数据库运行中直接备份
- 冷备份(离线备份)
- 数据库停止的情况下
- 温备份
- 在数据库运行中进行,但会对数据库操作有营销
按照备份后文件的内容分类:
- 逻辑备份
- 文件内容可读,一般是文本文件,内容由一条条SQL语句或者是表内实际数据组成
- 裸文件备份
- 物理文件
按照备份数据库的内容分类:
- 完全备份
- 增量备份
- 日志备份
九、性能调优
- 选择合适的CPU
- 内存的重要性
- 硬盘对数据库性能的影响
- 合理地设置RAID
- 操作系统的选择也很重要
- 不同文件系统对数据库的影响
- 选择合适的基准测试工具