暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 简介及架构

logerJava 2021-08-17
318



前言




由于这几天工作上的事比较忙, 所以没有更公众号, 让大家久等了 . 本来想的是写一下 SpringBoot 的装配, 还有 Spring 的事务方面的文章, 但是由于这两个一个需要代码的配置一步一步实现, 另一个则需要源码阅读, 所以决定比较忙的时候写一些其他技术方面概念性的东西, 这样我也比较轻松, 在周末再写需要代码的东西 .

本篇文章讲解一下数据库中免费又牛×的 MySQL 的一些基础概念, 方便后续解读 MySQL




MySQL 简介




首先可以确定的是, MySQL 是一个关系型数据库, 关系数据库将数据保存在不同的表中, 而不是将所有数据放在一个大仓库内, 这样就增加了速度并提高了灵活性 .

在互联网行业中, MySQL 无疑占据着举足轻重的地位, "双11" 大家肯定耳熟能详, 在2012 年的 "双11" 活动中 MySQL 单库经受了最高达 6.5 万的 QPS, 某个拥有核心集群的总 QPS 稳定在 86 万以上, 并从未发生重大故障 . 当然这和阿里的工程师们离不开关系, 但这也证明了 MySQL 的天花板还是很高的 .




MySQL 的架构





1

MySQL 的逻辑架构



如上图, 我们可以分为三层来进行解读 :

  • 第一层的服务其实并不是 MySQL 独有的, 大多数的基于网络的客户端 服务器的工具都有类似架构, 例如连接处理, 授权认证等

  • 第二层是 MySQL 的核心服务, 大多数的 MySQL 功能都在这一层, 包括查询解析, 分析, 优化, 内置函数等, 所有跨存储引擎的功能也都在这一层实现 : 存储过程, 触发器, 视图等

  • 第三层包含了存储引擎, 负责 MySQL 中数据的存储和提取, 不同的存储引擎具有不同的优势和劣势, 服务器则通过 API 与存储引擎进行通信, 这些 API 屏蔽了不同存储引擎的差异


2

MySQL 的存储引擎



MySQL 中存在很多存储引擎, 下面我们分为常见与其他进行介绍 :

常见的存储引擎 :

  • InnoDB : InnoDB 是平时用的最多的存储引擎, MVCC 支持高并发、四个隔离级别(默认为可重复读)、支持事务操作、聚簇索引

  • MyISAM : 全文索引、压缩、空间函数、崩溃后无法安全恢复

其他的存储引擎 :

  • Archive : 只支持insert、select操作,适合日志和数据采集

  • Blackhole : 会丢弃所有插入数据,不做保存,记录Blackhole日志,可以用于复制数据库到备份库

  • CSV : 可以将CSV文件作为MySQL表处理,不支持索引

  • Federated : 访问MySQL服务器的一个代理,创建远程到MySQL服务器的客户端连接,默认禁用

  • Memory : 数据保存在内存中,不需要磁盘 I/O,重启后数据会丢失但是表结构会保留

  • Merge : MyISAM变种,可以用于日志或数据仓库,已被放弃

  • NDB : 集群引擎

  • ......

有这么多的存储引擎, 那么怎么选择合适的存储引擎呢 ?

loger 告诉大家一句话, 不要骚操作... 除非需要用到 InnoDB 不具备的特性的时候, 并且没有其他处理方案再选择其他存储引擎, 否则都用 InnoDB


3

并发控制



一听到并发控制, 大家肯定想到了什么 ? 没错就是🔒, 没有其他意外, MySQL 的并发控制也通过锁来实现, 我们可以大体分为两类 :

  • 读写锁 :

    读写锁也可以称为, 共享锁和排他锁, 其实非常简单, 读锁的共享的, 多个用户在同一时间可以访问同一个资源; 写锁是排他的, 一个写锁可以阻塞其他的写锁和读锁

  • 粒度锁 :

    所谓粒度锁就是让被锁住的资源更加具有选择性, 可分为以下两类 :

    • 表锁 : 看名字就可以知道, 锁住了整张表, 是开销最小的锁

    • 行锁 : 行锁可以最大程度支持并发, 因为锁的级别是行级的, 但同时它也具有最大的锁开销

关于 MySQL 的并发控制这里知识简单做一下介绍, 后续文章会有详细的讲解 .


4

事务



事务是什么 ? 简单来讲, 事务就是一组原子性的 SQL 查询, 要么全部成功, 要么全部失败回滚

提到事务, 那就不得不提初级程序面试必考问题 ACID :

  • 原子性 : 一个事务必须被视为一个不可分割的最小工作单元, 要么全成功, 要么全失败回滚

  • 一致性 : 数据库从一个一致性状态转换到另一个一致性状态

  • 隔离性 : 通常来说, 一个事务所做修改在最终提交之前, 对其他事务是不可见的

  • 持久性 : 一旦事务提交, 则其所作的修改就会永久保存到数据库中, 即使崩溃也不会丢失

事务的 ACID 特性可以确保排课系统不会错排你的课, 银行不会多收你的钱...

与实现锁一样, 事务同样会增加系统的开销, 同样的一组 SQL 实现了事务相比没有实现事务会需要更多的 CPU 处理, 更大的内存和更多的磁盘空间


5

隔离级别



在 SQL 标准中规定了四种隔离级别, 每一种级别都规定了一个事务中所作的修改, 哪些在事务内和事务间是可见的, 哪些是不可见的 .

四种隔离级别 :

  • 读未提交 : 事务可以读取未提交数据

  • 读已提交 : 事务只可以读取已经提交的事务所做的修改

  • 可重复读 : 同一个事务多次读取同样记录结果一致 (InnoDB默认级别)

  • 可串行化 : 读取每一行数据上都加锁

隔离级别脏读不可重复读幻读加锁读
读未提交×
读已提交××
可重复读×××
可串行化×××



6

多版本并发控制



MySQL 中大对数事务存储引擎实现都不是简单的行锁, 而是采用多版本并发控制 (MVCC), MVCC 的实现可以说是通过保存数据在某个时间的快照来实现的, 也就是说, 不管需要执行多长时间, 每个事务看到的数据都是一致的 . 当然不同存储引擎的 MVCC 实现也是不同的, 这里我们来简单说一下 InnoDB 的 MVCC :

  • 首先获取事务自己的版本号, 即事务id

  • 获取 ReadView

  • 查询得到的数据,然后与 ReadView 中的事务版本号进行比较, 隔离级别不同获取方式不同

    • 读未提交 : 直接读取最新版本 ReadView

    • 读已提交 : 每次查询的开始都会生成一个独立的 ReadView

    • 可重复读 : 可重复读隔离级别则在第一次读的时候生成一个 ReadView,之后的读都复用之前的 ReadView

  • 如果不符合 ReadView 规则, 那么就需要 UndoLog 中历史快照

  • 最后返回符合规则的数据

当然这里知识简介, 关于 MVCC 有很多知识点这里不做赘述


7

日志



MySQL 存在很多种日志, 不过我们比较熟悉的和有用的 loger 觉得只有四个 :

  • binlog : binlog 记录了数据库表结构和表数据变更,比如 update/delete/insert/truncate/create

  • redolog : 在写入内存后会产生 redolog,记录本次在某个页上做了什么修改

  • undolog : undolog是逻辑日志,存储着修改之前的数据,相当于一个前版本

  • slowlog : 慢查询日志,记录所有执行时间超过 long_query_time 的所有查询或不使用索引的查询

MySQL 的日志其实很有用处, 比如用来恢复数据, 查询线上慢查询等等




总结




作为一个程序员, 不可避免的要和数据库打交道, MySQL 作为耳熟能详的关系型数据库中的一员, 是我们要学习的重要对象, 一个不会数据库的程序员, 那就不是个程序员 . 学不好数据库怎么和 DBA 蛋逼呢 ?

我是 loger 扫描下方二维码关注, 更多知识分享等你来看


文章转载自logerJava,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论