数据库学习 | 《高性能MySQL》(MySQL架构)学习笔记(一)

《高性能MySQL》读书笔记(第一章)

文章目录

  • 1. MySQL逻辑架构
    • 1.1 连接管理与安全性
    • 1.2 优化与执行
  • 2. 并发控制
    • 读写锁
    • 锁粒度
  • 3. 事务
    • ACID
    • 隔离级别
    • 死锁
    • 事务日志
  • 4. 多版本并发控制
  • 5. MySQL的存储引擎
    • InnoDB存储引擎
    • MyISAM存储引擎

最近开始复习一下数据库的内容,同时加深一下今年春招匆匆忙忙看的数据库调优方面的内容。作为《高性能MySQL》的第一章,主要是简要的介绍了MySQL整体的一些主要特性,例如逻辑架构,存储引擎简介等。

1. MySQL逻辑架构

  • MySQL服务器逻辑架构图

数据库学习 | 《高性能MySQL》(MySQL架构)学习笔记(一)_第1张图片

以上展示了MySQL服务器的逻辑架构图,从上到下分为三层:

  • 最上层:该层服务并不是MySQL独有,包含服务有连接处理,授权认证,安全等
  • 中间层:大多数MySQL的核心服务功能在该层,包含解析、分析、优化、缓存以及所有的内置函数;所有跨存储引擎的功能在该层实现,如存储过程、触发器、视图等。
  • 最底层:包含了存储引擎,负责MySQL中的数据存储和操作。存储引擎不会去解析SQL,不同的存储引擎之间也不会进行通信,只是简单的响应上层服务器的请求。

1.1 连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,该连接的查询只会在这一个单独的线程中进行。

1.2 优化与执行

  • MySQL会解析查询,然后构建内部数据结构(解析树),之后对其进行各种优化(包括重写查询、决定表的读取顺序、以及选择合适的索引等)。

  • 对于 select 语句,在解析查询之前,服务器会先检查查询缓存(Query Cache),若已经存在相应查询,则直接返回而不进行相关过程。

2. 并发控制

只要有多个查询需要在同一时刻修改数据,则会出现并发控制的问题。本章主要讨论MySQL在两个层面的并发控制:服务器层和存储引擎层。

读写锁

当一个用户正在读取数据,而另外的用户正在修改数据,就会出现并发问题。使用并发控制解决此类并发读或者写的问题核心是,实现一个有两种锁组成的锁系统来解决,这两种锁通常称为 排他锁共享锁,也称为 写锁读锁

  • 读锁:是共享的,或者说相互不阻塞的。多个用户可以同时读取同一个资源,而互不干扰。
  • 写锁:是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。只有这样可以确定,当一个用户在写入数据时,可以防止其他用户读取正在写入的同一资源。

锁粒度

在给定的资源上,锁定的资源越少,系统的并发性越高。但同时,加锁这一过程也是需要消耗资源的。所以所谓的锁策略就是在锁的开销和数据的安全性上寻找平衡。

在MySQL中存在多种选择,不同的存储引擎可以实现自己的锁策略和锁粒度。

  • 表锁:表锁是MySQL中最基本的锁策略,同时开销也是最小的,获得表锁后会锁定整张表,

  • 行锁:行锁可以最大程度的支持并发处理(同时带来最大的锁开销)。InnoDB引擎实现的就是行级锁,并且行锁有且只能在存储引擎进行实现。

3. 事务

事务是一组原子性的SQL查询,或者说是一个独立的工作单元。

ACID

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

隔离级别

隔离级别规定了,在一个事务中所做的修改,哪些在事务内和事物间是可见的,哪些是不可见的。

  • READ UNCOMMITTED(为提交读)
  • READ COMMITED(提交读)
  • REPEATABLE READ(可重复读)
  • SERIALIZABLE(可串行化)

死锁

死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

目前InnoDB处理死锁的方法是,将持有最少行级锁的事务进行回滚

事务日志

事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘。目前大多数存储引擎都是这样实现的,我们通常称之为预写式日志(Write-Ahead Logging),修改数据需要写两次磁盘。

4. 多版本并发控制

多版本并发控制:MVCC

可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。

ImioDB 的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和査询到的每行记录的版本号进行比较。

5. MySQL的存储引擎

使用以下命令查看表的信息

show table status like 'tuser'\G

InnoDB存储引擎

InnoDB 是MYSQL的默认事务型引擎,也是最重要、最广泛使用的存储引擎。

特性:

  • InnoDB 采用了 MVCC 支持高并发,并且实现了四个标准的隔离级别,其默认隔离级别为 REPEATABLE READ(可重复读)
  • InnoDB表是基于聚簇索引建立的,
  • 作为事务型的存储引擎,MySQL通过一些机制支持热备份

MyISAM存储引擎

特性:

  • 不支持行级锁、事务
  • 支持全文索引
  • 奔溃后无法安全恢复
  • 可以采用压缩表(压缩表是不能修改的)

你可能感兴趣的:(数据库,学习)