前言
好耶!是
MySQL补全计划六!
MVCC
MVCC的意义就在于可以使不同的事务并发读数据不会阻塞,我们接着上篇,来说一下MVCC的核心概念。
readview
readview是快照读sql执行时mvcc读取数据的依据,包括四个核心字段。

上篇我们说到,除了我们自己添加的数据外,mysql还会自动给我们添加一些隐藏字段。
- DB_TRX_ID:当前是哪个事务修改了这行数据,记录- ID,而且,- ID还是自增的
- DB_ROLL_PTR:当进行回滚时,需要回滚到的版本,这个指针是指向- undo log的
所以,我们是否可以读某个事务(ID可以区分)修改的数据,就可以与这个事务的ID进行比较。
而read view正好帮我们维护了一些还未提交的事务id,read view把这些个未提交的事务叫做活跃事务。
readview对版本链的访问规则
事务开始时(开启手动提交):
- 系统会为这个事务分配一个新的事务 ID(trx_id)
- 如果该事务第一次执行快照读(普通的 SELECT),就会创建一个ReadView
ReadView 的组成:
- creator_trx_id:表示这个 ReadView 是哪个事务创建的
- m_ids:当前系统中活跃的事务 ID(还没提交的)
- min_trx_id:- m_ids中最小的 ID
- max_trx_id:创建 ReadView 时,系统中下一个即将分配的事务 ID
其他事务在执行写操作时:
- 修改数据不直接覆盖旧数据,而是:
- 把旧值写入 undo log,形成版本链(由 roll_pointer连接)
- 将新值写到页中,标记新的 trx_id
 
- 把旧值写入 undo log,形成版本链(由 
当前事务读取数据时:
- 遇到一条记录的当前版本
- 根据该记录的 trx_id和本事务的ReadView判断它是否可见- 如果不可见,顺着 undo log中的版本链回退
- 找到第一个符合 ReadView 可见性规则的旧版本
 
- 如果不可见,顺着 
ReadView 决定你“能不能看”某个版本,undo log 提供你“可以看的版本”。
不同的隔离级别,生成read view的时机是不同的
- read commit,在这个隔离级别中,只可以读到已经提交的事务的数据,不保证可重复读,也就是在每次快照读的时候都会生成- read view
- rr,保证可重复读,仅在第一次执行快照读的时候生成- read view,后续复用- read view
视图/存储过程/触发器
什么是视图
视图时一种虚拟存在的表。视图中的数据并不在数据库中存在,行和列的数据来自定义视图查询中使用的表,并且是动态生成的。
创建视图view
我们可以使用create和replace with关键字来创建或修改视图。
|  |  | 
意思就是说,select的返回结果其实也是一张表,根据返回结果,我们来创建对应的视图结构
这里有一张user表,其内容如下
|  |  | 
假设我们要创建只有两列关键字的视图
|  |  | 
当创建好视图后,就可以像正常操作sql数据库中其它的表一样
|  |  | 
可以看到,只有两列字段,剩余的age字段在创建视图的时候我们没有选择这个字段,所以视图中不包含这个字段。
查询当前数据库的view
查看创建视图的语句
|  |  | 
例如
|  |  | 
其中就包含我们创建这个视图时所使用到的sql语句。
修改视图
修改视图,一种是重新创建
|  |  | 
就是使用replace语句来替代原始的那个视图。
或者直接把视图当作表来使用,即使用alter关键字。
|  |  | 
重新进行选择即可。
删除视图
使用drop关键字
|  |  | 
MySQL管理
系统数据库
Mysql数据库安装完后,自带了四个数据库,我们可以看看当前所有的数据库
|  |  | 

数据库备份
|  |  | 

总结
下面我们来看一看一些更加高级的操作,例如,分库分表、读写分离等这些操作!