1.1MySQL逻辑架构图

MySQL基本架构分为三层:
(1)第一层的服务不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构
(2)第二层架构是MySQL的核心服务功能所在地,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图
(3)第三层包含了存储引擎。**存储引擎负责MySQL中数据的存储与提取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎API包含几十个底层函数,存储引擎不会解析SQL,不同的存储引擎之间也不会相互通信,而只是简单地响应上层服务器的要求
1.1.1连接管理与安全性
每个客户端都会在服务器进程中创建一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行,服务器会负责缓存线程,有些也支持线程池,可以使用线程池少量的线程来服务大量的连接,当客户端连接到服务器时,服务器需要对其进行认证,认证基于用户名,原始主机信息和密码
1.1.2优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等
并发控制
无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题。
在处理并发读或者写时,可以通过实现一个由两种类型组成的锁来解决问题,这两种类型的锁通常被称为共享锁和排他锁,也叫读锁和写锁
锁的概念是这样的:读锁是共享的,或者说是相互不堵塞的,多个客户端在同一时刻可以同时读取同一个资源,而不互相干扰。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁
1.2.1锁粒度
一种提高共享资源并发性的方式就是让锁定对象更有选择性,尽量只锁定需要修改的部分数据,而不是所有的资源,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可
问题的关键在于加锁也需要消耗资源,锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。
表锁
表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表,一个用户在对表进行写操作,需要先获得写锁,这会阻塞其他用户对该表的所有的读写操作。
行级锁,
行级锁可以最大程度地支持并发处理,同时也给带来了最大地锁开销。行级锁只在存储引擎层实现,而MySQL服务器层没有实现,服务器层完全不了解存储引擎中地锁实现。
1.3事务
事务就是一组原子性的SQL查询,或者说是一个独立的工作单元。,事务内的语句,要么全部执行成功,要么全部执行失败。
一个良好的事务处理系统必须通过严格的ACID测试,ACID表示原子性,一致性,隔离性和持久性
原子性
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对一个事务来说,不可能只执行其中的一部分,即事务的原子性体现了事务不可分隔的特点
一致性
数据库总是从一个一致性的状态转换到另外一个一致性的状态,数据库的一致性可以分为数据库外部的一致性和数据库内部的一致性:
外部的一致性:由外部编码来实现,即银行的应用在进行转账的操作时,必须在同一事务内部调用对账户A和B的操作
数据库内部的一致性:在同一个事务内部的一组操作必须全部成功或者全部失败,即事务的原子性
是不是可以这么理解一致性:完成一个事务时,事务所要实现的目标要全部完成
隔离性
通常来说,一个事务所能做的修改在最终提交以前,对其他事务是不可见的
持久性
一旦事务提交,则其所做的修改就会永久保存到数据库中
1.3.1隔离级别
SQL定义四种隔离级别
(1) READ UNCOMMITTED(未提交读)
在READ UNCOMMITTED级别中,事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读
(2)READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是),这个级别能满足隔离性的简单定义:一个事务开始时,只能看到已经提交的事务所做的修改,READ COMMITTED也别乘坐不可重复读,因为相同的查询,也有可能会得到不同的结果
(3)REPEATABLE READ(可重复读)
该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。但是可重复读还是无法解决幻读的问题,所谓的幻读,就是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行
可重复读是MySQL的默认事务隔离级别
(4)SERIALIZABLE(可串性化)
该级别是最高的隔离级别,它通过强制事务串行执行,简单来说,SERIALIZABLE会读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用的问题
| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁性 |
|---|---|---|---|---|
| READ UNCOMMITTED | YES | YES | YES | NO |
| READ COMMITTED | NO | YES | YES | NO |
| REPEATABLE READ | NO | NO | YES | NO |
| SERIALIZABLE | NO | NO | NO | YES |
总结:脏读就是读取了未提交的数据,不可重复读就是读取了提交了的数据,幻读就是读取了提交的数据和自己提交的数据有所差别
这里在说一下不可重复读和幻读的区别:不可重复读是指两次读取同一个数据,两次的结果都不一样,幻读是指事务在插入或者删除已经检查过不存在的记录时,发现这些数据已经存在或者消失了,之前的检测犹如幻觉一样
1.3.2死锁
死锁是指两个或者多个事务在同一资源上相互利用,并请求锁定对方占用的资源,从而导致恶性循环的现象,就是谁也得不到资源,一直空等待
1.3.3MYSQL中的事务日志

mySQL采用默认采用自动提交模式,也就是说,如果不是显示地开始一个事务,那么每个查询都被当做一个事务执行提交操作
MySQL可以通过设置执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别,新的隔离级别会在下一个事务开始地时候生效。
1.5MySQL中地搜索引擎
可以使用SHOW TABLE STATUS LIKE ‘表名’ \G来查看表地相关信息

1232

被折叠的 条评论
为什么被折叠?



