# class1-1

[TOC]

# MySQL版本演变

  • 1995年,MySQL 1.0发布,仅供内部使用。
  • 1996年,MySQL 3.11.1发布,直接跳过了MySQL 2.x版本。
  • 1999年,MySQL AB公司成立。同年,发布MySQL 3.23,该版本集成了Berkeley DB存储引擎。该引擎由Sleepycat公司开发,支持事务。在集成该引擎的过程中,对源码进行了改造,为后续可插拔式存储引擎架构奠定了基础。
  • 2000年,ISAM升级为MyISAM存储引擎。同年,MySQL基于GPL协议开放源码。
  • 2002年,MySQL 4.0发布,集成了后来大名鼎鼎的InnoDB存储引擎。该引擎由Innobase公司开发,支持事务,支持行级锁,适用于OLTP等高并发场景。
  • 2005年,MySQL 5.0发布,开始支持游标,存储过程,触发器,视图,XA事务等特性。同年,Oracle收购Innobase公司。
  • 2008年,Sun以10亿美金收购MySQL AB。同年,发布MySQL 5.1,其开始支持定时器(Event scheduler),分区,基于行的复制等特性。
  • 2009年,Oracle以74亿美金收购Sun公司。
  • 2010*,MySQL 5.5发布,其包括如下重要特性及更新。 InnoDB代替MyISAM成为MySQL默认的存储引擎。 多核扩展,能更充分地使用多核CPU。 InnoDB的性能提升,包括支持索引的快速创建,表压缩,I/O子系统的性能提升,PURGE操作从主线程中剥离出来,Buffer Pool可拆分为多个Instances。 半同步复制。 引入utf8mb4字符集,可用来存储emoji表情。 引入metadata locks(元数据锁)。 分区表的增强,新增两个分区类型:RANGE COLUMNS和LIST COLUMNS。 MySQL企业版引入线程池。 可配置IO读写线程的数量(innodb_read_io_threads,innodb_write_io_threads)。在此之前,其数量为1,且不可配置。 引入innodb_io_capacity选项,用于控制脏页刷新的数量。
  • 2013年,MySQL 5.6发布,其包括如下重要特性及更新。 GTID复制。 无损复制。 延迟复制。 基于库级别的并行复制。 mysqlbinlog可远程备份binlog。 对TIME, DATETIME和TIMESTAMP进行了重构,可支持小数秒。DATETIME的空间需求也从之前的8个字节减少到5个字节。 Online DDL。ALTER操作不再阻塞DML。 可传输表空间(transportable tablespaces)。 统计信息的持久化。避免主从之间或数据库重启后,同一个SQL的执行计划有差异。 全文索引。 InnoDB Memcached plugin。 EXPLAIN可用来查看DELETE,INSERT,REPLACE,UPDATE等DML操作的执行计划,在此之前,只支持SELECT操作。 分区表的增强,包括最大可用分区数增加至8192,支持分区和非分区表之间的数据交换,操作时显式指定分区。 Redo Log总大小的限制从之前的4G扩展至512G。 Undo Log可保存在独立表空间中,因其是随机IO,更适合放到SSD中。但仍然不支持空间的自动回收。 可dump和load Buffer pool的状态,避免数据库重启后需要较长的预热时间。 InnoDB内部的性能提升,包括拆分kernel mutex,引入独立的刷新线程,可设置多个purge线程。 优化器性能提升,引入了ICP,MRR,BKA等特性,针对子查询进行了优化。 可以说,MySQL 5.6是MySQL历史上一个里程碑式的版本,这也是目前生产上应用得最广泛的版本。
  • 2015年,MySQL 5.7发布,其包括如下重要特性及更新。 组复制 InnoDB Cluster 多源复制 增强半同步(AFTER_SYNC) 基于WRITESET的并行复制。 在线开启GTID复制。 在线设置复制过滤规则。 在线修改Buffer pool的大小。 在同一长度编码字节内,修改VARCHAR的大小只需修改表的元数据,无需创建临时表。 可设置NUMA架构的内存分配策略(innodb_numa_interleave)。 透明页压缩(Transparent Page Compression)。 UNDO表空间的自动回收。 查询优化器的重构和增强。 可查看当前正在执行的SQL的执行计

# MySQL引擎

现有引擎是 InnoDB

截屏2021-01-16 下午3.32.33

截屏2021-01-16 下午3.34.01

MyIsAM与InnoDB的区别

截屏2021-01-16 下午3.35.28

# 隔离级别

  • READ UNCOMMITTED:幻读,不可重复读和脏读均允许
  • READ COMMITTED:允许幻读和不可重复读,但不允许脏读
  • REPEATABLE READ:允许幻读,但不允许不可重复读和脏读
  • SERIALIZABLE:幻读,不可重复读和脏读都不允许

# 体系结构

5-200622094009461

# 1. 连接层

应用程序通过接口(如 ODBC、JDBC)来连接 MySQL,最先连接处理的是连接层。连接层包括通信协议、线程处理、用户名密码认证 3 部分。

  • 通信协议负责检测客户端版本是否兼容 MySQL 服务端。
  • 线程处理是指每一个连接请求都会分配一个对应的线程,相当于一条 SQL 对应一个线程,一个线程对应一个逻辑 CPU,在多个逻辑 CPU 之间进行切换。
  • 密码认证用来验证用户创建的账号、密码,以及 host 主机授权是否可以连接到 MySQL 服务器。

Connection Pool(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

# 2. SQL层

SQL 层是 MySQL 的核心,MySQL 的核心服务都是在这层实现的。主要包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。

  • 权限判断可以审核用户有没有访问某个库、某个表,或者表里某行数据的权限。
  • 查询缓存通过 Query Cache 进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端,不必再进行查询解析、优化和执行等过程。
  • 查询解析器针对 SQL 语句进行解析,判断语法是否正确。
  • 预处理器对解析器无法解析的语义进行处理。
  • 查询优化器对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。

Management Services & Utilities、SQL Interface、Parser、Optimizer 和 Caches & Buffers 属于 SQL 层,详细说明如下表所示。

名称 说明
Management Services & Utilities MySQL 的系统管理和控制工具,包括备份恢复、MySQL 复制、集群等。
SQL Interface(SQL 接口) 用来接收用户的 SQL 命令,返回用户需要查询的结果。例如 SELECT FROM 就是调用 SQL Interface。
Parser(查询解析器) 在 SQL 命令传递到解析器的时候会被解析器验证和解析,以便 MySQL 优化器可以识别的数据结构或返回 SQL 语句的错误。
Optimizer(查询优化器) SQL 语句在查询之前会使用查询优化器对查询进行优化,同时验证用户是否有权限进行查询,缓存中是否有可用的最新数据。它使用“选取-投影-连接”策略进行查询。 例如 SELECT id, name FROM student WHERE gender = "女";语句中,SELECT 查询先根据 WHERE 语句进行选取,而不是将表全部查询出来以后再进行 gender 过滤。SELECT 查询先根据 id 和 name 进行属性投影,而不是将属性全部取出以后再进行过滤,将这两个查询条件连接起来生成最终查询结果。
Caches & Buffers(查询缓存) 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key 缓存、权限缓存等。

# 3. 存储引擎层

Pluggable Storage Engines 属于存储引擎层。存储引擎层是 MySQL 数据库区别于其他数据库最核心的一点,也是 MySQL 最具特色的一个地方。主要负责 MySQL 中数据的存储和提取。

因为在关系数据库中,数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

# 4. 文件系统层

文件系统层主要是将数据库的数据存储在操作系统的文件系统之上,并完成与存储引擎的交互。

# reference

https://juejin.cn/post/6844903654328107015

Last Updated: 1/16/2021, 9:27:12 AM