阅读笔记-【高性能MySQL】
第一章-MySQL架构与历史
概述:
MySQL灵活、能够适应高要求环境;
1.1 MySQL 逻辑结构
包含三层:
第一层是:客户端的链接/线程处理(该层不是MySQL独有的)主要用于链接处理、授权认证、安全等等;
第二层是:MySQL的核心服务功能都在这块,包括解析分析优化缓存以及所有的内置函数,所有夸存储引擎的功能都在这一层实现:存储过程、触发器、
视图等等;
第三层是:包含了存储引擎。负责mysql中数据的存储和提取。
1.1.1 链接管理与安全性
链接->[链接是否成功]->继续验证权限
1.1.2 优化与执行
两种方式:
1、用户通过特殊的关键字提示优化器,影响它的决策过程;
2、请求优化器解释优化过程的各个因素;
1.2 并发控制
两个层面的并发控制:
1、服务器层;
2、存储引擎层;
1.2.1 读写锁
1、共享锁(shared lock)也称之为:读锁(read lock):
读锁是共享的,多个客户在同一时刻可以读取同一资源,而互不干扰。
2、排他锁(exclusive lock)也称之为:写锁(write lock):
写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
1.2.2 锁粒度
一种 提高 共享资源 并发性 的 方式就是让 锁定对象更有选择性。
在给定的资源生,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。
注意:
加锁是会消耗性能的。
所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡。
两种重要的表锁结构:
表锁
表锁是MySQL中 最基本的 锁策略, 并且是 开销最小的锁策略。
在表锁中:一个写锁请求可以插入到锁队列的 最前面,反之读锁则不能插入到写锁的前面。
行级索
行级锁可以最大程度的支持并发处理,同时也带来 最大的锁开销 的锁策略。
行级锁只在 存储引擎 层实现。
1.3 事务
描述:事务就是一组 原子性 的SQL查询 ,事务内的语句,要么全部执行成功,要么全部执行失败。
START TRANSACTION 语句开始一个事务,使用 COMMIT 提交事务将修改的数据永久保存, 使用 ROLLBACK 撤销所有的修改。
事务的 ACID 概念
A:原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部回滚失败,对于一个事务而言,不可能只执行
其中的一部分操作,这就是 事务 的 原子性。
C:一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。
一致性可以确保在运行时数据库崩溃后,也不会对数据进行修改,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中
I:隔离性(isolation)
通常来说,一个事务所做的修改修改在最终提交以前,对其他事务是不可见的。
D:持久性(durability)
一旦事务提交后,其所做的修改就会永久保存到数据库中。
1.3.1 隔离级别
定义了四种隔离级别:
1、READ UNCOMMITTED(未提交读)
在 READ UNCOMMITTED 级别,事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称之为 脏读(Dirty Read)。
除非必要,在实际应用中一般很少使用。
2、READ COMMITED(提交读)
不是MySQL的默认隔离级别;
一个事务从开始知道提交前,所做的任何修改对其他事务都是不可见的。也叫做 不可重复读(nonrepeatable read),因为两次执行同样的语句,可
能会得到不一样的结果。
3、REPEATABLE READ(可重复读)
是MySQL默认的隔离级别;
REPEATABLE READ 解决了脏读的问题。该级别保证了在同一事务中多次读取同样记录的结果是一致的。
但无法解决另一个问题:
幻读(Phantom Read) 指在某个事务再次读取该范围的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围
的记录时会产生幻行(Phantom Row);
4、SERIALIZABLE(可串行化)
SERIALIZABLE是最高的隔离级别。
它通过强制事务串行执行,避免了前面说的幻读问题。
SERIALIZABLE会在读取的每一行数据都加上锁,所以可能导致大量的超时和锁争用问题
实际应用中也很少运用该级别的隔离事务,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。
ANSI SQL 隔离级别
隔离级别 | 脏读可能性 | 不可重复可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED(未提交读) | Yes | Yes | Yes | No |
READ COMMITED(提交读) | No | Yes | Yes | No |
REPEATABLE READ(可重复读) | No | No | Yes | No |
SERIALIZABLE(可串行化) | No | No | No | Yes |