Mysql补全计划(六)

前言

好耶!是MySQL补全计划六!

MVCC

MVCC的意义就在于可以使不同的事务并发读数据不会阻塞,我们接着上篇,来说一下MVCC的核心概念。

readview

readview是快照读sql执行时mvcc读取数据的依据,包括四个核心字段。

image-20250621232000312

上篇我们说到,除了我们自己添加的数据外,mysql还会自动给我们添加一些隐藏字段。

  • DB_TRX_ID:当前是哪个事务修改了这行数据,记录ID,而且,ID还是自增的
  • DB_ROLL_PTR:当进行回滚时,需要回滚到的版本,这个指针是指向undo log

所以,我们是否可以读某个事务(ID可以区分)修改的数据,就可以与这个事务的ID进行比较。

read view正好帮我们维护了一些还未提交的事务idread view把这些个未提交的事务叫做活跃事务

readview对版本链的访问规则

事务开始时(开启手动提交)

  • 系统会为这个事务分配一个新的事务 ID(trx_id
  • 如果该事务第一次执行快照读(普通的 SELECT),就会创建一个 ReadView

ReadView 的组成:

  • creator_trx_id:表示这个 ReadView 是哪个事务创建的
  • m_ids:当前系统中活跃的事务 ID(还没提交的)
  • min_trx_idm_ids 中最小的 ID
  • max_trx_id:创建 ReadView 时,系统中下一个即将分配的事务 ID

其他事务在执行写操作时:

  • 修改数据不直接覆盖旧数据,而是:
    • 把旧值写入 undo log,形成版本链(由 roll_pointer 连接)
    • 将新值写到页中,标记新的 trx_id

当前事务读取数据时:

  • 遇到一条记录的当前版本
  • 根据该记录的 trx_id 和本事务的 ReadView 判断它是否可见
    • 如果不可见,顺着 undo log 中的版本链回退
    • 找到第一个符合 ReadView 可见性规则的旧版本

ReadView 决定你“能不能看”某个版本,undo log 提供你“可以看的版本”。

不同的隔离级别,生成read view的时机是不同的

  • read commit,在这个隔离级别中,只可以读到已经提交的事务的数据,不保证可重复读,也就是在每次快照读的时候都会生成read view
  • rr,保证可重复读,仅在第一次执行快照读的时候生成read view,后续复用read view

视图/存储过程/触发器

什么是视图

视图时一种虚拟存在的表。视图中的数据并不在数据库中存在,行和列的数据来自定义视图查询中使用的表,并且是动态生成的。

创建视图view

我们可以使用createreplace with关键字来创建或修改视图。

1
create or replace view 视图名称 as select col1, col2, ... from ... where ...;

意思就是说,select的返回结果其实也是一张表,根据返回结果,我们来创建对应的视图结构

这里有一张user表,其内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql> select * from user;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | zxp1 |   18 |
|  2 | zxp2 |   19 |
|  3 | zxp3 |   20 |
|  4 | zxp4 |   22 |
|  5 | zxp5 |   23 |
+----+------+------+
5 rows in set (0.00 sec)

假设我们要创建只有两列关键字的视图

1
mysql> create  or replace view view_id_name as select id, name from user;

当创建好视图后,就可以像正常操作sql数据库中其它的表一样

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 select * from view_id_name;
+----+------+
| id | name |
+----+------+
|  1 | zxp1 |
|  2 | zxp2 |
|  3 | zxp3 |
|  4 | zxp4 |
|  5 | zxp5 |
+----+------+

可以看到,只有两列字段,剩余的age字段在创建视图的时候我们没有选择这个字段,所以视图中不包含这个字段。

查询当前数据库的view

查看创建视图的语句

1
show create view 视图名;

例如

1
show create view view_id_name;

其中就包含我们创建这个视图时所使用到的sql语句。

修改视图

修改视图,一种是重新创建

1
create or replace view 视图名称 as select .....;

就是使用replace语句来替代原始的那个视图。

或者直接把视图当作表来使用,即使用alter关键字。

1
alter view 视图名 as select ....

重新进行选择即可。

删除视图

使用drop关键字

1
drop view if exists 视图名

MySQL管理

系统数据库

Mysql数据库安装完后,自带了四个数据库,我们可以看看当前所有的数据库

1
show databases;

image-20250625221243683

数据库备份

1
mysqldump

image-20250625221659199

总结

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

Licensed under CC BY-NC-SA 4.0
花有重开日,人无再少年
使用 Hugo 构建
主题 StackJimmy 设计