• [面试直通版]数据库核心之索引,性能与安全(下)


    点击->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