MySQL的详细讲解

2021-10-14

Mysql的架构与历史

MySQL的逻辑架构

第二层的架构是所有的跨引擎的功能实现的地方,例如:存储,触发器,视图等。

第三层半酣了 存储引擎,负责MySQL中的数据存储和提取。

连接管理与安全性

每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。当客户端(应用)连接MySQL服务器时,服务器需要对其进行认证。

优化与执行

解析查询,内部会创建数据结构(解析树),然后对其优化,选择合适的索引,可以请求优化器的解释,优化器不关心用的什么引擎,但是存储的引擎对优化查询是有影响的,对于select语句,解析查询的时候,先查缓存,命中了就返回缓存的结果集。

并发控制

俩个层面的并发控制:服务器层与存储引擎层。

简单的处理就是上锁,例如读写锁。

锁力度

一种提高共享资源的并发性的方式是让锁定对象更具有选择性。但是问题是加锁也是需要消耗资源的,所以需要把握平衡。MySQL提供了多种选择:有着自己的锁策略和锁粒度。

表锁

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。它会锁定整张表。

行级锁

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)。行级锁只在存储引擎层实现,而MySQL服务器层没有实现,服务器层完全不了解存储引擎中的锁实现。

事务

MySQL实战45讲(01--05)-笔记-隔离性

ACID

这里讨论一下隔离性,实际比想象的要复杂。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。

读未提交 一个事务还没提交时,它做的变更就能被别的事务看到 直接返回记录上的最新值,没有视图概念
读提交 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的 这个视图是在每个 SQL 语句开始执行的时候创建的
可重复读 未提交变更对其他事务是不可见的 这个视图是在事务启动时创建的,整个事务存在期间都用这个视图
串行化 顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 直接用加锁的方式来避免并行访问
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

 

Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),
因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

 

Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,
当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

 

Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

事务日志

MySQL实战45讲(01--05)-笔记-重要的日志模块

多版本并发控制

你可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞式读,在写操作进行时只锁定必要的记录。

MVCC会保存某个时间点上的数据快照。这意味着事务可以看到一个一致的数据视图,不管他们需要跑多久。这同时也意味着不同的事务在同一个时间点看到的同一个表的数据可能是不同的。

Innodb

更新中…………