MySQL知识点总结(五)主从复制,MySQL中的锁 与 MVCC

4. 主从复制

  • 复制的基本原理
  1. master 将改变记录到二进制日志(binary log)
  2. slave 将 master 的二进制日志拷贝到他的中继日志(relay log)
  3. slave 重做中继日志中的时间,将改变应用到自己的数据库中。MySQL的主从复制是异步且串行化的(最大问题:存在延时)
  • 主从复制的基本原则

    每个slave只能有一个master,每个master可以有多个slave

5. MySQL中的锁

5.1 从对数据操作类型分

共享锁/读锁

SELECT * FROM `test` WHERE `id` = 1 LOCK IN SHARE MODE;
  1. 多个事务的查询语句可以共用一把共享锁;
  2. 如果只有一个事务拿到了共享锁,则该事务可以对数据进行 UPDATE DETELE 等操作;
  3. 如果有多个事务拿到了共享锁,则所有事务都不能对数据进行 UPDATE DETELE 等操作。

排他锁/写锁

SELECT * FROM `test` WHERE `id` = 1 FOR UPDATE;
  1. 只有一个事务能获取该数据的排它锁;
  2. 一旦有一个事务获取了该数据的排它锁之后,其余事务对于该数据的操作将会被阻塞,直至锁释放。

自增锁

如果表中存在自增字段,MySQL便会自动维护一个自增锁

为什么主键设置成自增

主键上设置自增属性,可以保证每次插入都是插入到最后面,可以有效的减少索引页的分裂和数据的移动。

自增锁会导致出现幻读的情况(某个事务中途插入后会导致在本事务中主键不连续)

5.2从操作粒度分

行锁/记录锁(Record Locks) SELECT * FROM test WHERE id=1 FOR UPDATE; 锁住一行记录

  • 操作未使用索引,行锁会升级为表锁

  • 间隙锁(Gap Lock)

    1. 间隙锁只有在事务隔离级别 RR 中才会产生;
    2. 唯一索引只有锁住多条记录或者一条不存在的记录的时候,才会产生间隙锁,指定给某条存在的记录加锁的时候,只会加记录锁,不会产生间隙锁;
    3. 普通索引不管是锁住单条,还是多条记录,都会产生间隙锁;
    4. 间隙锁会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现幻读现象;

表锁 偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低

5.3 数据库是如何加锁的

大体的举个例子如下:

一个sql :select * from user where id=1;

数据库收到sql后会,判断id是不是索引:如果是索引,数据库则就行进行检索索引,对这条索引进行加锁,加锁加的是行锁;如果Id不是索引,则加的是表锁。

如果加的是行锁,会判断根据sql,添加不同的类型的行锁:如果是查询语句,所加的共享锁(S锁,读锁);如果是增删改语句,则加的是排他锁。

如果加的表锁,则会根据加的是表锁,则会判断表是否存在其他的锁。如果存在锁且是S锁,则可以进行加表锁。如果加的是X锁,则无法加表锁。

在加表锁的时候,是如何判断有锁的?重新检索索引,来判断是加锁?那是不可能的,因为那样效率会低的令人发指,尤其是表级锁,需要检索完所有的数据才能知道是表级别锁,效率可想而知。这个时候就有了意向锁。

意向锁,只是一个意向,他的意思是:这个表,里面的数据或索引已经加锁了。其实他就是一个标志,来告诉数据库已经加锁的标志。意向锁的存在说明该结点的下层结点正在被加锁

对任一元组加锁时,必须先对它所在的关系加意向锁。所以正确的是,加共享锁(S锁,读锁)时候,会在之前加上意向共享锁(IS锁)。告诉下一个要操作这张表的事物,这张表的数据加了共享锁。

通过锁实现的是,读的时候不能写(允许多个线程同时读,即共享锁,S锁),写的时候不能读(一次最多只能有一个线程对同一份数据进行写操作,即排它锁,X锁)。这样的加锁访问,只能实现并发的读,因为它最终实现的是读写串行化,这样就大大降低了数据库的读写性能。加锁访问其实就是和MVCC相对的LBCC,即基于锁的并发控制(Lock-Based Concurrent Control),是四种隔离级别中级别最高的Serialize隔离级别。

6. MVCC( Multi-Version Concurrency Control 多版本并发控制 )

MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存 。通俗的讲就是MVCC通过保存数据的历史版本,根据比较版本号来处理数据的是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果。

  • MVCC每次更新操作都会复制一条新的记录,新纪录的创建时间为当前事务id
  • 优势为读不加锁,读写不冲突
  • InnoDb存储引擎中,每行数据包含了一些隐藏字段 DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT
  • DATA_TRX_ID 字段记录了数据的创建和删除时间,这个时间指的是对数据进行操作的事务的id
  • DATA_ROLL_PTR 指向当前数据的undo log记录,回滚数据就是通过这个指针
  • DELETE BIT位用于标识该记录是否被删除,这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在mysql进行数据的GC,清理历史版本数据的时候。

具体的DML:

  • INSERT:创建一条新数据,DB_TRX_ID中的创建时间为当前事务id,DB_ROLL_PT为NULL
  • DELETE:将当前行的DB_TRX_ID中的删除时间设置为当前事务id,DELETE BIT设置为1
  • UPDATE:复制了一行,新行的DB_TRX_ID中的创建时间为当前事务id,删除时间为空,DB_ROLL_PT指向了上一个版本的记录,事务提交后DB_ROLL_PT置为NULL

为了提高并发度,InnoDb提供了这个「非锁定读」,即不需要等待访问行上的锁释放,又解决了幻读。

6.1MVCC与隔离级别
  • Read Uncommitted每次都读取记录的最新版本,会出现脏读,未实现MVCC
  • Serializable对所有读操作都加锁,读写发生冲突,不会使用MVCC
  • SELECT
    • (RR级别)InnoDB检查每行数据,确保它们符合两个标准:
    • 只查找创建时间早于当前事务id的记录,这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行
    • 行的DELETE BIT为1时,查找删除时间晚于当前事务id的记录,确定了当前事务开始之前,行没有被删除
    • (RC级别)每次重新计算read view,read view的范围为InnoDb中最大的事务id,为避免脏读读取的是DB_ROLL_PT指向的记录

简单的SELECT不加条件的查询在RR下肯定是读不到隔壁事务提交的数据的。但是仍然可能在执行INSERT/UPDATE时遇到幻读现象。因为SELECT 不加锁的快照读行为是无法限制其他事务对新增重合范围的数据的插入的。

所以还要引入第二个机制。

6.2 Next-Key Lock

其实更多的幻读现象是通过写操作来发现的,如SELECT了3条数据,UPDATE的时候可能返回了4个成功结果,或者INSERT某条不在的数据时忽然报错说唯一索引冲突等。

首先来了解一下InnoDB的锁机制,InnoDB有三种行锁:

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况
  • Next-Key Lock:前两个锁的加和,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题

如果是带排他锁操作(除了INSERT/UPDATE/DELETE这种,还包括SELECT FOR UPDATE/LOCK IN SHARE MODE等),它们默认都在操作的记录上加了Next-Key Lock。只有使用了这里的操作后才会在相应的记录周围和记录本身加锁,即Record Lock + Gap Lock,所以会导致有冲突操作的事务阻塞进而超时失败。

隔离级别越高并发度越差,性能越差,虽然MySQL默认的是RR,但是如果业务不需要严格的没有幻读现象,是可以降低为RC的或修改配置innodb_locks_unsafe_for_binlog为1 来避免Gap Lock的。 注意有的时候MySQL会自动对Next-Key Lock进行优化,退化为只加Record Lock,不加Gap Lock,如相关条件字段为主键时直接加Record Lock。

第一篇
MySQL知识点总结(一)基础语法

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 45讲是由杨恒宇老师主讲的MySQL数据库前沿技术课程,包括了MySQL的各个方面的知识点和实践经验。以下是MySQL 45讲的思维导图内容: 1. MySQL架构基础 - 架构介绍:Server层和存储引擎层 - 连接管理器和连接池 - SQL解析和查询优化 2. InnoDB存储引擎 - InnoDB架构和特性 - 事务和机制 - MVCC多版本并发控制 - InnoDB存储引擎的存储结构和索引原理 3. SQL优化 - 查询性能优化 - 索引优化和建立原则 - 慢查询分析和优化 - Explain和性能分析工具的使用 4. 高性能索引 - B+树索引和Hash索引 - 索引的数据结构和存储原理 - 聚簇索引和辅助索引 - 全文索引和空间索引 5. 事务隔离和并发控制 - ACID特性和事务隔离级别 - 死粒度 - 乐观和悲观机制 - 并发控制算法:读写和多版本并发控制 6. 复制和高可用 - 主从复制和读写分离 - 二进制日志和GTID - 基于半同步复制的高可用解决方案 - 高可用架构设计原则 7. InnoDB性能调优 - InnoDB存储引擎的性能调优 - 缓冲池和日志系统的优化 - 文件IO和磁盘性能的优化 - 服务器参数和配置优化 8. 分库分表 - 分库分表架构设计 - 按需扩展和数据迁移 - 分布式事务和一致性 - 分表策略和路由规则 9. 高可用集群 - 数据库架构设计和分片策略 - 自动化运维和故障恢复 - 高可用备份和恢复 - 数据一致性和性能优化 10. SQL解析和执行过程 - SQL解析器的工作原理 - 查询优化器的优化策略 - 执行引擎的执行过程 - 索引扫描和排序算法 这些是MySQL 45讲的主要内容和知识点,通过学习和理解这些内容,可以深入了解MySQL的架构和内部原理,并能够进行性能调优和架构设计。 ### 回答2: 《MySQL 45讲》是一本深入讲解MySQL数据库的书籍,内容丰富全面,涉及了数据库基础知识、SQL语句、索引优化、事务与、复制原理等方面。以下是该书的思维导图。 数据库基础知识方面,该书首先介绍了MySQL的架构与特点,包括MySQL Server、存储引擎、日志、缓存等组成部分。然后详细讲解了MySQL的数据类型、索引原理、查询优化器、表结构设计等内容。 SQL语句方面,该书对常用的SQL语句进行了解读,包括查询、插入、更新、删除等操作。同时,还介绍了SQL语句的执行流程、优化技巧和常见的性能问题及解决方法。 索引优化方面,该书重点介绍了索引的原理与使用方法。从B+树的结构入手,详细解释了索引的创建、维护和使用,以及索引的类型和优缺点。同时,还介绍了如何通过优化SQL语句和选择合适的索引来提升查询性能。 事务与方面,该书全面剖析了MySQL的事务特性和隔离级别,解释了事务的概念、ACID特性和并发控制问题。同时,深入讲解了MySQL机制,包括共享、排他、行、表等,以及如何避免死和提升并发性能。 复制原理方面,该书详细介绍了MySQL的复制原理和架构,包括主从复制、半同步复制、组复制等。讲解了复制的配置方法和常见问题的解决方法,以及如何进行备库切换和故障恢复。 通过《MySQL 45讲》的学习,读者将全面了解MySQL数据库的原理和使用方法,具备了解决常见性能问题和优化数据库的能力。这本书内容丰富、实用性强,非常适合MySQL开发人员和DBA阅读。 ### 回答3: 《MySQL 45讲》是针对MySQL数据库的一本经典著作,也是很多MySQL开发者和DBA必读的一本书。下面是对该书的思维导图总结: 该书主要分为三个部分:基础篇、进阶篇和高手篇。 1. 基础篇: - MySQL基本架构:介绍了MySQL的架构和核心组件,包括连接器、查询缓存、分析器、优化器、执行器和存储引擎等。 - 日志系统:详细介绍了MySQL的日志系统,包括重做日志(redo log)和回滚日志(undo log)的机制和使用方式。 - 事务隔离:介绍了MySQL的事务隔离级别,包括读未提交、读已提交、可重复读和串行化,以及各种级别的实现方式和影响。 - 索引:详细讲解了MySQL索引的数据结构和原理,包括B树、B+树和哈希索引,以及索引使用和优化技巧。 - 查询执行流程:分析了MySQL查询的执行流程,从SQL解析到查询优化和执行的整个过程,以及各个阶段的优化方法。 - 机制:介绍了MySQL机制,包括共享和排他的概念和使用场景,以及的类型和粒度。 - SQL优化:提供了SQL性能优化的一些基本策略和技巧,包括索引优化、查询重写和分表等。 2. 进阶篇: - 查询优化器:深入介绍了MySQL查询优化器的工作原理和使用方法,包括查询重写、索引选择和执行计划的生成等。 - 数据备份与恢复:讲解了MySQL数据备份和恢复的方法和工具,包括物理备份和逻辑备份,以及主从复制和增量备份等。 - 主从复制:详细介绍了MySQL主从复制原理和使用方法,包括复制的基本流程、数据同步方式和延迟问题的解决。 - 高可用架构:提供了一些MySQL高可用架构的选择和使用方法,包括主备复制、多主复制和MGR等。 - 影子库:介绍了MySQL的影子库技术,用于在生产环境不受影响的情况下进行性能测试和数据分析。 - 对账与差异:讲解了MySQL数据对账和差异检测的方法和工具,以及一些常用的差异处理方式和技巧。 3. 高手篇: - 参数调优:详细介绍了MySQL参数调优的方法和技巧,包括修改参数值和监控参数的方式。 - 慢查询优化:讲解了MySQL慢查询的原因和优化方法,包括慢查询日志的分析和优化器的干预。 - SQL解析和执行:深入分析了MySQL SQL语句的解析和执行过程,包括语法解析器和执行计划的生成方式。 - 字符集与编码:介绍了MySQL的字符集和编码的原理和应用,包括字符集的选择和转换方式。 - 存储引擎:详细介绍了MySQL的存储引擎,包括InnoDB、MyISAM和Memory等,以及它们的特点和应用场景。 总结起来,《MySQL 45讲》是一本全面介绍MySQL数据库的著作,从基础的架构和原理到进阶的优化技巧和高级应用,涵盖了MySQL开发和管理的方方面面。无论是初学者还是经验丰富的开发者和DBA,都可以从获得宝贵的知识和实践经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值