参考书籍:高性能MySQL第三版
MySQL三层逻辑架构
- (第一层) 客户端
不是MySQL独有,作用:连接数据库、认证等等 - (第二层) 处理引擎
MySQL核心业务层,作用:查询解析、分析、优化、缓存(服务器端)和内置函数。 - (第三层) 存储引擎
作用:负责MySQL的数据存储和提取 - 连接管理
a. 每个客户端连接服务器都会创建(拥有)一个线程。
b. 处理查询操作时,均在当前单独的线程中运行!
c. 该线程轮流在CPU核中运行。
d. 服务器会将当前的线程缓存起来。 - 安全认证
客户端连接服务器端时,需提供用户名、密码、连接地址和端口号 - MySQL查询优化过程
查询–>解析–>Tree(解析树)–>优化处理(重写、表执行顺序、加载适合的索引等等)
可以通过Explain工具查看优化器的解析过程
并发控制
并发控制定义:
多个查询在同一时刻对数据进行修改操作时,那么并发控制问题将会产生
并发控制方案:
- 读锁(共享锁)和写锁(排他锁)
读锁是共享的,相互之间不阻塞!多个客户端在同一时刻读取同一资源时,互不干扰!
写锁是排他的,写锁会阻塞其他的写锁和读锁!!! - 锁粒度
在给定的资源上,锁的资源越少,并发程度越高。
但同时,加锁过程也需要消耗资源,选择更为稳妥的锁机制,还需要更优的锁策略。
1)表级锁:
a. 最基本的锁策略,也是开销最小的策略。将整张表进行加锁机制。
b. 当某个用户对表中进行写操作时,触发写锁机制后,将阻塞其他用户的读写操作!!
c. 诸如类似alert table操作时就是表级锁.
2)行级锁:
a. 可以最大程度的支持并发处理,但同时也最大程度实现锁的消耗
b. 行级锁只在存储引擎中实现
事务
-
事务特点:
原子性:不可分割的最小执行单元,要么全部成功,要么全部失败!
一致性:从一个一致性的状态转移到另一个一致性的状态。
隔离性:一个事务所做的修改在最终提交之前,对其他事务是不可见的。
持久性:一旦提交,其对数据的修改将永久保存到数据库中。 -
隔离性的隔离级别
1)READ UNCOMMITTED(未提交读):一个事务所做的修改在最终提交之前,对其他事务是可见的
后果:事务读取了为提交的数据,产生“脏读”情况。好处不多,实际应用中一般不采用。2)READ COMMITTED(提交读):满足上述的“隔离性”的定义,绝大多数的数据库默认的隔离级别均为READ COMMITTED
一个事务提交之后,它所做的变更才可以被别的事务看到,也称为“不可重复读”
后果:在这种隔离级别下,会引发脏读、不可重复读和幻读3)REPEATABLE READ(可重复读):解决“脏读”的问题,但可能产生“幻读”情况。
一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
后果:会引发幻读,但避免了脏读、不可重复读4)SERIALZABLE(串行化): 即我的事务尚未提交,别人就不能修改数据
对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行。
后果:最严格的隔离级别,所有事务按照次序依次执行。脏读、不可重复读、幻读都不会出现。