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

 

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文档上的丰富操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/76013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AUTOSAR规范与ECU软件开发(实践篇)3.3 AUTOSAR系统解决方案介绍(下)

示例将遵循AUTOSAR方法论来进行开发, 所用的AUTOSAR解决方案如图3.6所示。 图3.6 AUTOSAR系统解决方案 首先, 使用Matlab/Simulink来实现部分软件组件级的开发, 主要包括LightRequestSWC和LightControlSWC, 并自动生成应用层软件组…

Qt扫盲- Graphics View框架理论综述

Graphics View框架理论综述 一、概述二、Graphics View 体系结构1. The Scene2. The View3. 图元 Item 三、图形视图坐标系统1. 图元Item的坐标2. Scene Scene坐标3. View 视图坐标4. 坐标映射 四、关键特性1. 缩放和旋转2. 打印3. 拖放4. 鼠标指针和 提示5. 动画6. OpenGL渲染…

Coremail AI实验室:利用高级语境和视觉智能进行钓鱼邮件检测

在这个日益数字化的时代,对电子邮件安全需求是至关重要的。新兴的高级威胁邮件:应用社工技术的钓鱼邮件,仿冒公检法的钓鱼邮件等等,都需要更高级的防御策略。 Coremail邮件安全人工智能实验室,整合了高级文本语境理解和…

【实际开发19】- 压测 / 调优准备

目录 1. Jmeter 2. Jmeter 环境部署 1. 配置 : 临时修改语言 ~ Options → Choose Language → Chinese 3. Jmeter 并发测试 0. 提示 : Postman 测试是“串行”的 , 无法测试并发请求 1. daiding 1. Jmeter 下载 : Apache JMeter - Download Apache JMeter 详参&#xf…

蓝帽杯2022

计算机取证 1 内存取证获取开机密码 现对一个windows计算机进行取证,请您对以下问题进行分析解答。 从内存镜像中获得taqi7的开机密码是多少?(答案参考格式:abcABC123) 首先我们直接对 1.dmp 使用 vol查看 py -2 v…

如何给a-table增加列宽拖动功能

对于table的列宽设置 相信用过的人都知道,想要设置得很完美,几乎是不现实的,因为总有数据或长或短,那我们应该如何优化它呢?那便是让用户自行拖动列宽,从而能看全table的数据,但是对于antd-vue …

公司电脑三维图纸加密、机械图挡加密软件

机械图纸加密软件的问世,让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后,不仅可以很好的管理员工在工作时的上网娱乐,在对整个公司员工的工作效率上也有着明显的提高,那么对于机械图纸加密软件的具体特…

利用Lifecycle,管理一个计时器生命周期

Lifecycle是Android Jetpack中的一个组件,用于管理Android应用程序组件(如Activity或Fragment)的生命周期。它可以帮助开发者在不同的生命周期阶段执行特定的操作,以便更好地管理资源、处理数据和提供用户体验。 Lifecycle作用 …

Python基础知识:列表推导式详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 我们经常需要这样处理一个列表: 把一个列表里面的每个元素, 经过相同的处理 ,生成另一个列表。 👇 👇 👇 更多精彩机密、教程,尽在下方…

Lie group 专题:Lie 群

Lie group 专题:Lie 群 流形 流形的定义 一个m维流形是满足以下条件的集合M:存在可数多个称为坐标卡(图集)的子集合族.以及映到的连通开子集上的一对一映射,,称为局部坐标映射,满足以下条件 坐标卡覆盖M…

最新AI系统ChatGPT网站程序源码+搭建教程/公众号/H5端/安装配置教程/完整知识库

1、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!…

结构体和数组结合使用

1、定义结构体 struct Student {int num;char name[32]; }; 2、结构体数组定义 #include<iostream> using namespace std;struct Student {int num;char name[32]; }; int main() {//结构体变量复制方式2struct Student arr[2] { {1,"张三"}, {2,"李四…

《电路》基础知识入门学习笔记

文章目录&#xff1a; 一&#xff1a;电路模型和电路规律 1.电路概述 2.电路模型 3.基本电路物理量&#xff1a;电流、电压、电功率和能量 4.电流和电压的参考方向 5.电路元件—电阻 6. 电路元件—电压源和电流源 7.受控电源 8.基尔霍夫&#xff08;后面都要用这个方法…

主流的嵌入式微处理器

目前主流的嵌入式微处理器系列有&#xff1a; ARM系列 MIPS系列 PowerPC系列 Super H系列 一、MPC/PPC系列 PowerPC(简称PPC),其基本设计源自IBM的POWER.1991年&#xff0c;APPLE(苹果电脑)、IBM、Motorola&#xff08;摩托罗拉&#xff09;组成的AIM联盟发展出Power微处理器…

stack+queue

适配器 介绍 在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;有几种适配器&#xff0c;它们是一些容器或函数对象的包装&#xff0c;提供了不同的接口和功能&#xff0c;用于适应特定的需求 分类 STL中的适配器可以分为两类&#xff1a;容器适配器和迭代器适配器 容…

6.3 社会工程学攻击

数据参考&#xff1a;CISP官方 目录 社会工程学攻击概念社会工程学攻击利用的人性 “弱点”典型社会工程学攻击方式社会工程学攻击防护 一、社会工程学攻击概念 什么是社会工程学攻击 也被称为 "社交工程学" 攻击利用人性弱点 (本能反应、贪婪、易于信任等) 进…

AUTOSAR规范与ECU软件开发(实践篇)3.2 ETAS AUTOSAR系统解决方案介绍(上)

1、ETAS AUTOSAR系统解决方案介绍 博世集团ETAS公司基于其强大的研发实力为用户提供了一套高效、 可靠的AUTOSAR系统解决方案&#xff0c; 该方案覆盖了软件架构设计、 应用层模型设计、 基础软件开发、 软件虚拟验证等各个方面&#xff0c; 如图3.5所示&#xff0c; 其中深色…

大语言模型之一 Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手&#xff0c;其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品&#xff0c;任何形态的用户可触及的都可以是产品&#xff0c…

synchronized 底层是如何实现的 ?

目录 1. synchronized 底层是如何实现的 2. 监视器的执行流程 1. synchronized 底层是如何实现的 synchronized 底层是通过 JVM 内置的 Monitor 监视器实现的。 以下代码&#xff0c;查看它运行时的字节码文件&#xff1a; public class SynchronizedMonitorDemo {public …

pycharm中配置conda

安装好pycharm和conda后&#xff0c;打开pycharm&#xff1a;