读高性能MySQL(第4版)笔记02_MySQL架构(下)

这篇具有很好参考价值的文章主要介绍了读高性能MySQL(第4版)笔记02_MySQL架构(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读高性能MySQL(第4版)笔记02_MySQL架构(下)文章来源地址https://www.toymoban.com/news/detail-650169.html

1. 事务日志

1.1. 事务日志有助于提高事务的效率

1.1.1. 存储引擎只需要更改内存中的数据副本,而不用每次修改磁盘中的表,这会非常快

1.1.2. 更改的记录写入事务日志中,事务日志会被持久化保存在硬盘上

1.2. 事务日志采用的是追加写操作,是在硬盘中一小块区域内的顺序I/O,而不是需要写多个地方的随机I/O,所以写入事务日志是一种相对较快的操作

1.3. 大多数使用这种技术(write-ahead logging,预写式日志)的存储引擎修改数据最终需要写入磁盘两次

1.4. 如果修改操作已经写入事务日志,那么即使系统在数据本身写入硬盘之前发生崩溃,存储引擎仍可在重新启动时恢复更改

2. MySQL中的事务

2.1. 自动提交模式

2.1.1. AUTOCOMMIT

2.1.2. 通过禁用此模式,可以在事务中执行一系列语句,并在结束时执行COMMIT提交事务或ROLLBACK回滚事务

2.2. 可以使用SET命令设置AUTOCOMMIT变量来启用或禁用自动提交模式

2.2.1. 启用可以设置为1或者ON

2.2.2. 禁用可以设置为0或者OFF

2.3. AUTOCOMMIT=0,则当前连接总是会处于某个事务中,直到发出COMMIT或者ROLLBACK,然后MySQL会立即启动一个新的事务

2.4. 除了在禁用AUTOCOMMIT的事务中可以使用之外,其他任何时候都不要显式地执行LOCK TABLES,不管使用的是什么存储引擎

2.5. 执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别

2.5.1. 新的隔离级别会在下一个事务开始的时候生效

2.5.2. 最好在服务器级别设置最常用的隔离,并且只在显式情况下修改

2.6. MySQL不在服务器层管理事务,事务是由下层的存储引擎实现的

2.6.1. 在同一个事务中,混合使用多种存储引擎是不可靠的

2.6.2. 为每张表选择合适的存储引擎,并不惜一切代价避免在应用中混合使用存储引擎是非常重要的

2.6.3. 在非事务表中执行事务相关操作的时候,MySQL通常不会发出提醒,也不会报错

2.6.4. 最好不要在应用程序中混合使用存储引擎

2.6.4.1. 失败的事务可能导致不一致的结果,因为某些部分可以回滚,而其他部分不能回滚

2.7. InnoDB使用两阶段锁定协议

2.7.1. two-phase locking protocol

2.7.2. 在事务执行期间,随时都可以获取锁

2.7.3. 但锁只有在提交或回滚后才会释放,并且所有的锁会同时释放

2.8. InnoDB还支持通过特定的语句进行显式锁定

2.8.1. 不属于SQL规范

2.9. 支持LOCK TABLES和UNLOCK TABLES命令,这些命令在服务器级别而不在存储引擎中实现

2.10. 应该使用支持事务的存储引擎

2.10.1. InnoDB支持行级锁,所以没必要使用LOCKTABLES

3. 多版本并发控制

3.1. MVCC

3.2. 行级锁的一个变种

3.2.1. 在很多情况下避免了加锁操作,因此开销更低

3.2.2. 不仅实现了非阻塞的读操作,写操作也只锁定必要的行

3.3. Undo日志写入是服务器崩溃恢复过程的一部分,并且是事务性的

3.3.1. 所有Undo日志写入也都会写入Redo日志

3.3.2. Redo日志和Undo日志的大小也是高并发事务工作机制中的重要影响因素

3.4. 仅适用于REPEATABLE READ和READ COMMITTED隔离级别

3.5. READ UNCOMMITTED与MVCC不兼容

3.5.1. 查询不会读取适合其事务版本的行版本,而是不管怎样都读最新版本

3.6. SERIALIZABLE与MVCC也不兼容

3.6.1. 读取会锁定它们返回的每一行

4. 复制

4.1. 一种原生方式来将一个节点执行的写操作分发到其他节点

4.2. 对于在生产环境中运行的任何数据,都应该使用复制并至少有三个以上的副本

4.3. 理想情况下应该分布在不同的地区(在云托管环境中,称为region)用于灾难恢复计划

5. 数据文件结构

5.1. 在8.0版本中

5.1.1. 将表的元数据重新设计为一种数据字典

5.1.1.1. 在表的.ibd文件中

5.1.1.2. 减少了I/O,非常高效

5.1.2. 删除了基于文件的表元数据存储

5.2. 引入了字典对象缓存

5.2.1. 基于最近最少使用(LRU)的内存缓存

5.2.1.1. 分区定义

5.2.1.2. 表定义

5.2.1.3. 存储程序定义

5.2.1.4. 字符集

5.2.1.5. 排序信息

5.2.2. 当前访问最活跃的那些表,在缓存中最常出现

5.2.2.1. 每个表的.ibd和.frm文件被替换为已经被序列化的字典信息(.sdi)

5.3. 原子DDL

5.3.1. MySQL 8.0引入了原子数据定义更改

5.3.2. 数据定义语句现在要么全部成功完成,要么全部失败回滚

6. InnoDB引擎

6.1. MySQL主要的改进核心在于InnoDB的演进

6.1.1. 表元数据、用户认证、身份鉴权这些内部统计信息的管理也已经调整为使用InnoDB表来实现

6.2. MySQL的默认事务型存储引擎

6.2.1. 现在已经成为金标准,是推荐使用的引擎

6.2.2. 最重要、使用最广泛的引擎

6.2.3. 为处理大量短期事务而设计的,这些事务通常是正常提交的,很少会被回滚

6.2.4. 几乎能覆盖每一种使用场景

6.3. 最佳实践是使用InnoDB存储引擎作为所有应用程序的默认引擎

6.4. 将数据存储在一系列的数据文件中,这些文件统被称为表空间(tablespace)

6.4.1. 表空间本质上是一个由InnoDB自己管理的黑盒

6.5. 使用MVCC来实现高并发性,并实现了所有4个SQL标准隔离级别

6.5.1. 默认为REPEATABLE READ隔离级别

6.5.2. 通过间隙锁(next-key locking)策略来防止在这个隔离级别上的幻读

6.5.2.1. 不只锁定在查询中涉及的行,还会对索引结构中的间隙进行锁定,以防止幻行被插入

6.6. InnoDB表是基于聚簇索引构建的

6.6.1. 聚簇索引提供了非常快速的主键查找

6.7. 通过一些机制和工具支持真正的在线“热”备份

6.7.1. Oracle专有的MySQL Enterprise Backup

6.7.2. 开源的Percona XtraBackup

6.8. 引入了SQL函数来支持在JSON文档上的丰富操作

到了这里,关于读高性能MySQL(第4版)笔记02_MySQL架构(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《高性能MySQL》——查询性能优化(笔记)

    将查询看作一个任务,那么它由一系列子任务组成,实际我们所做的就是: 消除一些子任务 减少子任务的执行次数 让子任务运行更快 查询的生命周期大概可分为 = { 客户端 服务器 : 进行解析 , 生成执行计划 执行:包括到存储引擎的调用,以及用后的数据处理 { 排序 分组

    2024年02月13日
    浏览(52)
  • 读高性能MySQL(第4版)笔记09_创建高性能索引(下)

    1.4.4.1. InnoDB的二级索引在叶子节点中保存了记录的主键值,所以如果二级索引能够覆盖查询,则可以避免对主键索引的二次查询 7.1.5.1. 常见的类似错误通常是由于尝试使用rsync备份InnoDB导致的 7.3.3.1. 否则,对于范围查询、索引覆盖扫描等操作来说,速度可能会降低很多 7

    2024年02月08日
    浏览(59)
  • 读高性能MySQL(第4版)笔记08_创建高性能索引(上)

    2.4.2.1. 按照索引列中的数据大小顺序存储的 2.4.3.1. 键前缀查找只适用于根据最左前缀的查找 2.4.4.1. 在查询某些条件的数据时,存储引擎不再需要进行全表扫描 2.4.4.2. 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中

    2024年02月08日
    浏览(47)
  • 读高性能MySQL(第4版)笔记10_查询性能优化(上)

    4.11.1.1. 在存储引擎层完成的 4.11.2.1. 直接从索引中过滤不需要的记录并返回命中的结 4.11.2.2. 在MySQL服务器层完成的,但无须再回表查询记录 4.11.3.1. 在MySQL服务器层完成 4.11.3.2. 需要先从数据表中读出记录然后过滤 4.13.2.1. 使用单独的汇总表 5.5.1.1. 定期清除大量数据时,

    2024年02月08日
    浏览(57)
  • 读高性能MySQL(第4版)笔记12_查询性能优化(下)

    2.3.1.1. 读取行指针和需要排序的字段,对其进行排序,然后再根据排序结果读取所需要的数据行 2.3.1.2. 即需要从数据表中读取两次数据,第二次读取数据的时候,因为是读取排序列进行排序后的所有记录,这会产生大量的随机I/O,所以两次传输排序的成本非常高 2.3.2.1. 先

    2024年02月08日
    浏览(48)
  • 读高性能MySQL(第4版)笔记18_扩展MySQL

    4.2.2.1. 增加更多应用节点可以扩展服务用户请求的客户端数 4.2.2.2. 最终会被单源数据库主机的能力所限制,该数据库主机将要负责响应所有的读取请求 4.2.2.3. 高CPU使用率意味着服务器正花费所有的时间处理查询 4.2.2.4. CPU的使用率越高,查询的延迟也会越长 6.9.1.1. 负载均

    2024年02月08日
    浏览(52)
  • 读高性能MySQL(第4版)笔记03_监控

    7.1.1.1. 200响应代码 7.1.2.1. 202已接受 10.3.2.1. 连接的线程数(threads_connected)很高,但运行的线程数(threads_running)仍然很低 10.3.3.1. 连接的线程数(threads_connected)和运行的线程数(threads_running)都处于高值并持续增加 10.5.1.1. 数据库工程师不断努力的目标之一

    2024年02月12日
    浏览(36)
  • 读高性能MySQL(第4版)笔记16_复制(上)

    4.1.1.1. 通过记录所有在源端执行的数据变更语句来实现的 4.1.1.2. 简单且紧凑 4.1.1.3. 一条更新了大量数据的SQL语句,在二进制日志中可能仅仅需要几十字节存储 4.1.1.4. “不确定性”的SQL语句问题 4.1.1.4.1. 如果在源和副本上,记录的排序不同,这条SQL语句在源和副本上删除

    2024年02月08日
    浏览(38)
  • 读高性能MySQL(第4版)笔记17_复制(下)

    1.3.1.1. 安全补丁 1.3.1.2. 内核更新 1.3.1.3. 一些配置选项更改后需要重新启动才能生效 1.3.2.1. 确定将哪个副本切换为新的源 1.3.2.1.1. 一个包含所有数据的副本 1.3.2.2. 检查延时,确保延时在秒级别 1.3.2.3. 通过设置super_read_only停止数据写入源服务器 1.3.2.4. 等待副本与目标完

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包