五~九(完结)

五、索引和算法

六、锁

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
  • 操作系统的选择也很重要
  • 不同文件系统对数据库的影响
  • 选择合适的基准测试工具
posted @ 2023-10-08 19:31  LHX2018  阅读(8)  评论(0编辑  收藏  举报