-
[面试直通版]数据库核心之索引,性能与安全(下)
点击->SQL复习的文章集<-点击
目录
MVCC原理
典型问题:
回顾
MVCC原理
作用:
数据库备份与恢复
MySQL的几种日志
二进制日志(binlog)
重做日志(redolog)
回滚日志(undolog)
慢查询日志(slowquerylog)
中继日志(relaylog)
权限粒度
-
MVCC原理
-
典型问题:
- 请简述MVCC的原理
- 请简述MySQL控制并发有哪些粒度
-
回顾
- 点击->事务的四大特征与隔离级别<-点击
- 点击->脏读,不可重复读,幻读的问题演示和解决<-点击
- 点击->MyISAM读锁,写锁与悲观乐观锁<-点击
-
MVCC原理
- 读写性能与数据准确性成反比例关系
- 控制并发的粒度:
- 表级锁:操作特定表时,对整表增加互斥锁
- 行级锁:操作特定行数据时,对相应行增加互斥锁
- MVCC的全称为Multiversion Concurrency Control
- 中文意思是多版本并发控制技术
- 原理是通过数据行的多个版本管理来实现数据库的并发控制
- 简单来说就是保存数据的历史版本
- 可以通过比较版本号决定数据是否显示出来,读取数据时不需要加锁就可以保证事务的隔离效果
- 具体实现:
- 对于数据表来说,它的每一行数据在MySQL的InnoDB引擎里,都有3个隐藏列
- 这是实现MVCC的关键
- DB_ROW_ID:隐藏的行ID,用于生成默认的聚簇索引
- 如果一个表没有定义主键的话,MySQL将会使用这个隐藏行ID,来生成默认的聚簇索引
- DB_TRX_ID:隐藏的事务ID,最后一个操作该行数据的事务ID
- 是一个单调自增的id
- 产生变化:
- InnoDB为新插入的每一行保存当前系统版本号作为行版本号
- InnoDB为删除的每一行保存当前事务版本号作为行删除标识
- 是删除标记位写入当前事务版本号的
- 删除在内部被视为更新,行中的一个特殊位会被设置为已删除
- 更改:
- InnoDB为插入一行新记录,保存当前事务版本号作为行版本号
- 保存当前事务版本号到原来的行作为行删除标识
- 具体就是一个插入和删除的过程
- 查询数据:
- InnoDB只查找版本早于当前事务版本的数据行 (也就是,行的系统版本号小于或等于事务的系统版本号)
- 行的删除版本要么未定义,要么大于当前事务版本号
- 这可以确保事务读取到的行,在事务开始之前未被删除
- DB_ROLL_PTR:回滚指针,指向这条记录的Undo Log信息
-
作用:
- 解决读写阻塞问题(读写不阻塞)
- 降低死锁的概率 (乐观锁、非必要不加锁)
- 解决一致性读的问题(快照读)
- MVCC在一定程度上实现了读写并发
- 只在可重复读和提交读的两个隔离级别下工作
- 行锁、并发控制、事务回滚等多种特性都与MVCC有关
-
数据库备份与恢复
-
MySQL的几种日志
- 二进制日志(binlog)
- 重做日志(redolog)
- 回滚日志(undolog)
- 慢查询日志(slowquerylog)
- 中继日志(relaylog)
-
二进制日志(binlog)
- 数据库每一次操作,都会往磁盘里写一份binlog
- 主要用于备份/恢复-主备同步,恢复数据
- 是在磁盘进行数据冗余备份
- 默认的binlog为二进制格式
- 可以通过mysqlbinlog命令解析成可读日志
- 内容就是可读的增、删、改SQL语句
- 查询语句不影响MySQL数据,所以查询语句不会被记录下来
-
重做日志(redolog)
- 为保护事务的原子性而设计的日志
- 在事务操作的同时,也会记录redolog到磁盘上
- redolog到磁盘有一种缓冲机制,使得写日志的速度比写MySQL快很多
- 再细:
- 事务提交MySQL后,同步也会记录redolog到磁盘
- 如果事务提交过程故障,则重新执行redolog恢复事务
- 如果当前事务成功落磁盘,则redolog就失去作用了
-
回滚日志(undolog)
- undolog和redolog功能类似,作用相反
- 如果事务执行过程故障,则通过undolog回滚事务
- MySQL恢复到事务执行前的状态
-
慢查询日志(slowquerylog)
- 根据查询数据量的不同,不同SQL会有不同的查询时间
- Slowquerylog是用于记录超过正常时间查询语句的日志
- 对于慢查询的优化,可以通过explain找到性能瓶颈,优化性能
-
中继日志(relaylog)
- relaylog和binlog功能类似,都是主备同步时用到
- relaylog数据格式和binlog一致
- relaylog实际上相当于是备份节点的缓冲buffer
- 额外记录备份情况: master.info 、relay-log.info
-
权限粒度
- 全局层级(global level)
- 数据库层级(database level)
- 数据库对象层级(table level)
- 列层级(column level)
- 全局层级(global level):
- 作用于整个mysql实例级别,包括操作数据库、服务启停、配置更改等,其权限信息存储在mysql.user表
- 数据库层级(database level):
- 作用于指定的数据库的所有对象中,包括触发器、视图、表、索引等,权限信息存储在mysql.db表
- 数据库对象层级(table level):
- 作用于指定数据库的指定表,包括对表结构的维护、表级锁等,权限信息存储在 mysql.tables_priv表
- 列层级(column level):
- 作用于指定数据库指定表的列,包括对表特定列的增删改查、列定义修改等,权限信息存储在mysql.columns_priv表
-
相关阅读:
湖北2022农民丰收节 国稻种芯:麻城启动王忠林宣布活动
更改字段的类型
Spring Cloud Alibaba
代码随想录算法训练营|五十七天
Navicat Premium 16.X--不错的数据库工具
基于单片机的纸牌24点游戏模拟器设计
如何用c写fastcgi运行在apache下面
Git+py+ipynb Usage
Java IO流
Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序
-
原文地址:https://blog.csdn.net/weixin_59624686/article/details/126979114