MySQL架构与历史
重点摘要
MySQL的逻辑架构分为三层
1.连接层,负责连接处理,授权认证,安全登
2.服务层,负责查询解析,分析,优化,缓存及所有函数,包括存储过程,触发器,试图等.
3.存储引擎层主要负责数据的提取与存储.
MySQL会解析查询,创建内部数据结构,进行优化包括重写查询,决定表的读取顺序,选择合适的索引.
处理并发读或者写时可以通过实现由共享锁(读锁)和排他锁(写锁)组成的系统来解决问题.
锁的粒度一般分为表锁和行锁,锁定的数据量越少,并发的程度越高,开销也越大
服务器层 和存储引擎层 都有自己的锁,例如在执行ALTER TABLE的时候会使用服务器的锁忽略存储引擎的锁机制.
1.原子性:事务中的sql不可单独执行或者只执行部分,事务就是一个最小的单元,必须要全部执行或者全部不执行.
2.一致性:事务中的sql要么全部执行 要么全部失败.事务中的所有状态都必须一致的转变.
3.隔离性:A事务在执行到一半的时候,B事务无法获取A事务中已经执行完SQL结果
4.持久性:一旦事务提交,数据就会永久保存到数据库中.
事务的隔离级别分为四种,未提交读,不可重复读,可重复读,串行化,并不是所有的存储引擎都支持四种隔离级别.
事务的隔离界别会解决三个问题,脏读,重复读,幻读
未提交读: A事务可以读取到B事务中未提交的修改内容,存在脏读风险
不可重复读: 一个事务在开始和提交之前,其他事务均不可见,可以解决脏读问题,但是无法解决重复读问题, A事务中两次同样的查询可能会得到不一样的结果.
可重复读:这是MySQL的默认级别,可以解决重复读的问题,但是无法解决幻读问题,幻读和重复读的区别为幻读针对Insert和重复读针对update. InnoDB引擎通过MVCC解决了幻读问题.
串行化: 可以解决三种问题,但是性能最低
MySQL大多数的事务性引擎是实现的行级锁都不是简单的行级锁,基于提升并发性能考虑,他们都实现了多版本并发控制(MVCC)
可以理解MVCC属于行级锁的变种但是在大多数情况能避免加锁操作,
InnoDB的MVCC是通过每行记录的两个隐藏字段控制的(创建版本,删除版本)