模块十二_MySQL海量数据存储与优化(上)

2020-11-21  本文已影响0人  西西弗斯XD

序言:

文章内容输出来源:拉勾教育Java高薪训练营。
本篇文章是学习课程中的一部分课后笔记

一、 MySQL体系架构

体系架构.png
1、 网络连接层
2、服务层(MySQL Server)

服务层是MySQL Server的核心,主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分。

 select uid,name from user where gender=1;
选取--》投影--》联接 策略
1)select先根据where语句进行选取,并不是查询出全部数据再过滤
2)select查询根据uid和name进行属性投影,并不是取出所有字段
3)将前面选取和投影联接起来最终生成查询结果
3、存储引擎层(Pluggable Storage Engines)
4、系统文件层(File System)

二、MySQL运行机制

运行机制.png
  1. 建立连接(Connectors&Connection Pool),通过客户端/服务器通信协议与MySQL建立连接。MySQL 客户端与服务端的通信方式是 “ 半双工 ”。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么。

    • 通讯机制:
      全双工:能同时发送和接收数据,例如平时打电话。
      半双工:指的某一时刻,要么发送数据,要么接收数据,不能同时。例如早期对讲机
      单工:只能发送数据或只能接收数据。例如单行道
  2. 查询缓存(Cache&Buffer),这是MySQL的一个可优化查询的地方,如果开启了查询缓存且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启查询缓存或者没有查询到完全相同的 SQL 语句则会由解析器进行语法语义解析,并生成“解析树”。

  3. 解析器(Parser)将客户端发送的SQL进行语法解析,生成"解析树"。预处理器根据一些MySQL规则进一步检查“解析树”是否合法,例如这里将检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最后生成新的“解析树”。

  4. 查询优化器(Optimizer)根据“解析树”生成最优的执行计划。MySQL使用很多优化策略生成最优的执行计划,可以分为两类:静态优化(编译时优化)、动态优化(运行时优化)。

    • 等价变换策略
      • 5=5 and a>5 改成 a > 5
      • a < b and a=5 改成b>5 and a=5
      • 基于联合索引,调整条件位置等
    • 优化count、min、max等函数
      • InnoDB引擎min函数只需要找索引最左边
      • InnoDB引擎max函数只需要找索引最右边
      • MyISAM引擎count(*),不需要计算,直接返回
    • 提前终止查询
      • 使用了limit查询,获取limit所需的数据,就不在继续遍历后面数据
    • in的优化
      • MySQL对in查询,会先进行排序,再采用二分法查找数据。比如where id in (2,1,3),变
        成 in (1,2,3)
  1. 查询执行引擎负责执行 SQL 语句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,这时会将SQL 语句和结果完整地保存到查询缓存(Cache&Buffer)中,以后若有相同的 SQL 语句执行则直接返回结果。

    • 如果开启了查询缓存,先将查询结果做缓存操作
    • 返回结果过多,采用增量模式返回

三、MySQL存储引擎

1、各引擎简介

在5.5版本之前默认采用MyISAM存储引擎,从5.5开始采用InnoDB存储引擎。

2、InnoDB和MyISAM对比
3、InnoDB存储结构

MySQL 8.0 版本:


存储结构8.0.png
4、InnoDB数据文件

InnoDB数据文件存储结构:
分为一个ibd数据文件-->Segment(段)-->Extent(区)-->Page(页)-->Row(行)

四、 Undo Log

1、 Undo Log 介绍
show variables like '%innodb_undo%';
2、 Undo Log 作用
mvcc.png

五、 Redo Log和Binlog

1、 Redo Log日志
原理.png

原理
Redo Log 是为了实现事务的持久性而出现的产物。防止在发生故障的时间点,尚有脏页未写入表的 IBD 文件中,在重启 MySQL 服务的时候,根据 Redo Log 进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。

2、 Binlog日志

写入机制

Binlog文件中Log event结构如下图所示

even结构.png
3、 Redo Log和Binlog区别

六、 MySQL索引原理

1、索引类型
2、 索引原理

索引涉及的理论知识

B+树的搜索
B+树进行范围查找时,只需要查找定位两个节点的索引值,然后利用叶子节点的指针进行遍历即可。

b+tree.png

B树的搜索
从根节点开始,对节点内的索引值序列采用二分法查找,如果命中就结束查找。没有命中会进入子节点重复查找过程,直到所对应的的节点指针为空,或已经是叶子节点了才结束。

btree.png
3、 聚簇索引和辅助索引

在InnoDB引擎中,主键索引采用的就是聚簇索引结构存储。

4、 回表查询
5、覆盖索引
6、最左前缀原则

七、 MySQL事务

1、事务
事务.png 特性.png
2、MVCC
mvcc.png

在事务1开始写操作的时候会copy一个记录的副本,其他事务读操作会读取这个记录副本,因此不会影响其他事务对此记录的读取,实现写和读并行。

MVCC实现原理

MVCC最大的好处是读不加锁,读写不冲突。在读多写少的系统应用中,读写不冲突是非常重要的,极大的提升系统的并发性能,这也是为什么现阶段几乎所有的关系型数据库都支持 MVCC 的原因,不过目前MVCC只在 Read Commited 和 Repeatable Read 两种隔离级别下工作。

两种读操作

八、mysql 锁

1、锁分类

1.1、 从操作的粒度可分为表级锁、行级锁和页级锁。
1.2、从操作的类型可分为读锁和写锁。
1.3、 从操作的性能可分为乐观锁和悲观锁。

2、行锁原理

2.1、实现算法

3、 死锁与解决方案

3.1、表锁死锁

原因

解决方案:

3.2、行级锁死锁

产生原因1

产生原因2

解决方案2

3.3、共享锁转换为排他锁

产生原因

事务A: select * from dept where deptno=1 lock in share mode; //共享锁,1
update dept set dname='java' where deptno=1;//排他锁,3

事务B: update dept set dname='Java' where deptno=1;//由于1有共享锁,没法获取排他锁,需等待,2

解决方案

3.4、死锁排查

如果等待次数高,而且每次等待时间长,需要分析系统中为什么会有如此多的等待,然后着
手定制优化。

上一篇 下一篇

猜你喜欢

热点阅读