2021-07-24

MySQL体系结构与存储引擎

  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;循环写,空间会使用完。
  • binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”;追加写入,不会覆盖之前的内容。

模块一:高性能MySQL基础篇

1. 一条Select的执行轨迹
在这里插入图片描述
2. 一条Update的执行轨迹
update T set c=c+1 where ID=2
在这里插入图片描述

3.InnoDB存储引擎–MySQL5.6

  • 3. 1 buffer pool
    (1).buffer pool文件决定了SQL的执行快慢,单机实例情况下一般为物理内存的50%~60%。
    (2).查看buffer pool的占用:show global status like ‘%buffer_pool_wait%’
  • 3. 2 redo log
    循环复用的文件集件,负责记录所有对Buffer pool的物理修改日志,影响数据库的处理能力

4.ARIES 三原则
在这里插入图片描述
5.多版本控制–MVCC
  多版本控制也叫作 MVCC,是指在数据库中,为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。读不加锁。读操作可以分为两类:

  • 快照读(Snapshot Read)读取的是记录的可见版本(有可能是历史版
    本),不用加锁。
  • 当前读 (Current Read)读取的是记录的最新版本,并且当前读返回的记录,都会加锁,保证其他事务不会再并发修改这条记录

注意:MVCC 只在 Read Commited 和 Repeatable Read 两种隔离级别下工作。

如何区分快照读和当前读呢? 可以简单的理解为:

  • 快照读:简单的 select 操作,属于快照读,不需要加锁。
  • 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。

那个多版本是如何生成的呢?
  每一次对数据库的修改,都会在 Undo 日志中记录当前修改记录的事务号及修改前数据状态的存储地址(即 ROLL_PTR),以便在必要的时候可以回滚到老的数据版本。例如,一个读事务查询到当前记录,而最新的事务还未提交,根据原子性,读事务看不到最新数据,但可以去回滚段中找到老版本的数据,这样就生成了多个版本。
6.MySQL中锁的分类
在这里插入图片描述
- InnoDB行锁实行算法
在这里插入图片描述

  • Record Lock 锁:单个行记录的锁(锁数据,不锁 Gap)。
  • Gap Lock 锁:间隙锁,锁定一个范围,不包括记录本身(不锁数据,仅仅锁数据前面的Gap)。
  • Next-key Lock 锁:同时锁住数据,并且锁住数据前面的 Gap。

- InnDB产生死锁的四个条件

  • 互斥条件:一个资源每次只能被一个进程使用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
  • 不剥夺条件:进程已获得的资源,在没使用完之前,不能强行剥夺;
  • 循环等待条件:多个进程之间形成的一种互相循环等待资源的关系。

- 如何避免死锁的产生
在这里插入图片描述

模块二:互联网高性能MySQL最佳实践

1. 范式

  • 第一范式
      第一范式无重复的列,表中的每一列都是拆分的基本数据项,即列不能够再拆分成其他几列,强调的是列的原子性
      如果在实际场景中,一个联系人有家庭电话和公司电话,那么以“姓名、性别、电话”为表头的表结构就没有达到 1NF。要符合 1NF 我们只需把电话列拆分,让表头变为姓名、性别、家庭电话、公司电话即可。
  • 第二范式
      第二范式属性完全依赖于主键,首先要满足它符合 1NF,另外还需要包含两部分内容:
    • 表必须有一个主键;
    • 没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。即要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
  • 第三范式
      第三范式属性不传递依赖于其他非主属性,首先需要满足 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
    在这里插入图片描述
    2. 命名规范
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    3. 索引
    • 聚簇索引
       聚簇索引是一种数据存储方式,它表示表中的数据按照主键顺序存储,是索引组织表。InnoDB 的聚簇索引就是按照主键顺序构建 B+Tree,B+Tree 的叶子节点就是行记录,数据行和主键值紧凑地存储在一起。 这也意味着 InnoDB 的主键索引就是数据表本身,它按主键顺序存放了整张表的数据。
       而 InnoDB 辅助索引(也叫作二级索引)只是根据索引列构建 B+Tree,但在 B+Tree 的每一行都存了主键信息,加速回表操作。

在这里插入图片描述在这里插入图片描述
4. 查询性能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

- badSQL案例
在这里插入图片描述
5. 提高单库性能

-CPU
在这里插入图片描述

- 内存
在这里插入图片描述

- 磁盘
在这里插入图片描述

  • MySQL参数优化
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6. MySQL主从复制原理
在这里插入图片描述

模块三:MySQL高可用

1. MTBF 和 MTTR

  • MTBF
     MTBF(全称是Mean Time Between Failures,即平均故障间隔),是指系统在运行期间的平均连续无故障时间,提升 MTBF 就意味着减少故障出现的次数,加大系统正常运行的服务时长。
    最 近 一 次 故 障 时 间 d o w n t i m e − 上 一 次 故 障 修 复 时 的 时 间 u p t i m e 最近一次故障时间 down time − 上一次故障修复时的时间 uptime downtimeuptime
    在这里插入图片描述

  • MTBF
      MTTR(全称是Mean Time To Recovery,也就是平均修复时间),是指系统由故障状态转为正常运行状态所需修复时间的平均值。降低 MTTR 就意味着加速故障恢复的速度,例如故障在秒级恢复。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
2. 服务器监控要点
在这里插入图片描述
3. 常用监控系统
在这里插入图片描述

模块四:可扩展MySQL

1. 扩展的基本方法有哪些
在这里插入图片描述
2. 基于分布式事务的数据库

2. 1 TiDB

在这里插入图片描述

  • TiDBServers
     TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。 TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址。
  • PDServer
     Placement Driver (简称 PD)是整个集群的管理模块,其主要工作有三个: 一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。
     PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。
  • TiKV Server
     TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 RaftGroup,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。

2. 2 ArkDB

  • ArkDB Server
     ArkDB Server 为数据库接入层,负责响应客户端链接和权限验证,接收并处理 SQL 请求,包含连接管理、权限验证、分析器、优化器和执行器等,所以也叫计算节点。ArkDB Server 为无状态节点,其自身不存储数据,可以快速无限水平扩展,各个计算节点之间通过物理日志同步,同时通过操作 ArkDB Server 节点,实现整个数据库机器的高可用切换。在 ArkDB Server 层处理 SQL 请求的时候,需要分配合适的内存和 CPU 资源,对存储则无要求,可以做针对性的硬件优化。
  • ArkDB Engine
     ArkDB Engine 负责数据存储和读取,底层采用分布式存储。每个数据存储单位默认存储 3 副本,副本间的数据保持强一致性和容灾。ArkDB Engine 负责存储数据并实现数据共享。上层ArkDB Server 节点访问 ArkDB Engine 同一份数据。ArkDB Engine 支持根据业务访问策略对数据存储分级,用户可以根据预算、性能指标、容量请求、访问场景按需使用不同的存储硬件,同时针对闪存卡进行软硬件结合优化。

模块五:海量MySQL实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值