MySQL 逻辑架构
连接管理与安全性
每个客户端连接都会有一个线程
认证基于用户名,原始主机信息和密码
优化与执行
Mysql会解析查询并进行优化
对于select会先检查查询缓存,能够找到就直接返回结果集
并发控制
读写锁
锁在COMMIT或ROLLBACK时自动释放
读锁(共享锁)
共享,不阻塞,多个用户可以同时读同一个资源
写锁(独占锁)
保证只有一个用户写入,防止其他用户写入或读取数据
锁粒度
加锁,锁的检查,锁的解除都是要消耗系统资源的
加锁的对象大小成为锁粒度
锁策略
在锁的开销与数据的安全性中寻求平衡
行锁
最大程度支持并发,MySQL服务器层没有实现,由存储引擎实现
表锁
开销最小
MySQL服务器可以根据自己的目的加上表锁而忽略存储引擎的锁机制
事务
一组原子性的SQL语句,要么全部执行,要么全部不执行
ACID
- 原子性: 要么全部执行,要么全部不执行
- 一致性: 状态的改变是完全的,不存在改变一半就被保存的情况
- 隔离性: 在提交前对其他事务不可见
- 持久性: 数据更改会永远保存
隔离级别
未提交读(Read Uncommited)
即使事务未曾提交,数据对于其他事务也是可见的.即事务可以读取未提交的数据,也叫脏读或读脏数据
可提交读
即一个事务在提交之前,改变对其他事务是不可见的,又叫不可重复读,幻读(在一个事务读取数据后还未提交时,另一个事务更改了数据)
可重复读
解决了幻读和脏读的问题
可串行化
强制事务串行执行,给每一行数据加锁
死锁
死锁指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而造成的恶性循环
死锁发生后,只能通过部分或完全回滚事务才能解决
例子
事务日志
好处
- 避免频繁从内存向磁盘中写入数据(可以记录下日志操作,在后台慢慢一次写入,所以日志文件是追加写)
- 便于出现故障后的恢复
Mysql中的事务
自动提交(AUTOCOMMIT)
混合使用多种存储引擎
InnoDB: 支持事务
MyISAM: 不支持事务
不支持事务的表回滚不能撤销更改
隐式和显式锁定
显式: 自动加锁
隐式: 主动加锁
多版本并发控制(MVCC)
- 一个列保存了创建时间,一个列保存删除时间(时间指版本号)
- 每开始一个新的事务,系统版本号都会递增,并把事务开始时的版本号作为事务的版本号,供与查询到的每行版本号相匹配
MySql存储引擎
- 表的定义存储在.frm文件中
- 通过show table status 'tableName'查看表的相关定义信息
InnoDB
是MySql的默认事务型引擎,也是使用最广泛的存储引擎,被设计用来处理大量短期事务
- 数据存储在表空间中
- 采用MVCC实现并发,实现四种隔离级别,默认可重复读
- 基于聚簇索引(第二索引必须包含主键)建立
MyISAM
缺点
- 不支持事务和行级锁
- 数据库崩溃后无法安全恢复
特性
- 对整张表加锁,而不是针对行,但在读取数据的时候依然可以插入新的数据(并发插入)
- 延迟更新索引键
其他引擎
CSV
用于转化.csv文件成数据库里的表
Memory
Archive
第三方引擎
选择合适的引擎
除非用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎
最好不要混用多种存储引擎!!!
更换表的引擎
ALTER TABLE
ALTER Table name Engine = InnoDB