mac_girl

Mysql

全文参考:https://blog.csdn.net/qq_36756682/article/details/123738990

主从复制

1.什么是主从复制

主从复制是将主数据库的DDL、DML操作通过binlog(二进制日志)的方式传输到从数据库上,然后将这些日志重新执行。

2.主从复制的作用

  • 数据备份
  • 读写分离
  • 高可用和故障切换,当主数据库有问题,可以切换到从数据库

3.主从复制的原理

主从复制主要是依赖binlog和relay log实现的,它的实现原理总结为以下3个方面

  • 主的binlog线程会记录所有改变数据库的语句到master的binlong
  • 从的io线程会拉取master的binlog,然后放进自己的relay log中
  • 从的sql执行线程执行relay的语句

MYISAN和INNODB的区别

MYISAM: 不支持事务、支持表级锁、非聚簇索引、count()有变量存储、无需扫描全表、支持全文索引

INNODB: 支持事务、支持行级锁、聚簇索引

 聚簇索引:叶子节点(索引列+行记录)

非聚簇索引:叶子节点(索引列+主键索引列(聚簇索引))---非聚簇索引查询需要回表

事务的特性(ACID)

  • 原子性:一个事务要么全部成功,要么全部失败
  • 一致性: 事务从一个合法的状态转为另一个合法的状态
  • 隔离性:一个内部事务的操作以及数据的使用对并发的其它事务是隔离的
  • 持久性:一个事务一旦提交,这个事务对数据库的改变是永久性的

事务的四种特征是基于什么机制实现的

  • 隔离性是通过读写锁+MVCC机制实现的
  • 原子性是通过undo log实现的
  • 一致性是通过redo log实现的
  • 原子性、持久性、隔离性都只是手段,它的目的是为了实现一致性

undo log(回滚日志):当一个事务执行一半无法执行时,可以根据回滚日志恢复到变更之前的状态

redo log(重做日志): 每当操作时,在磁盘变更前,将操作写入redo logo, 当系统崩溃重启后可以继续执行

INNODB支持的四种事务隔离级别

参考:https://www.jianshu.com/p/933dbf51eb52

  • 读未提交:容易出现脏写、脏读、不可重复读、幻读

  • 读已提交:容易出现不可重复读、幻读
  • 可重复读:容易出现幻读
  • 串行化:可避免脏读、不可重复读、幻读

脏读:A、B两个事物, A事物读取了B事物未提交的数据,B事务回滚之后,造成了A事务的脏读

不可重复读:A、B两个事物,A事务读取了B已提交的数据,事务B再对数据进行更新,事务A两次读取到的数据不一致

幻读:事务A按范围读取N行数据,事务B更新或新增数据,数据A再读取相同范围的数据时,与首次读取的行数不同

InnoDB的默认隔离级别可重复读,该级别的不可重复读是通过MVCC实现的,幻读是通过间隙锁实现的。

间隙锁不是对具体的数据行加锁,而是对具体数据行之间的间隙加锁

数据并发产生的问题

  • 脏写:事务A修改了事务B未提交的数据
  • 脏读:事务A读取到了事务B未修改过的数据
  • 不可重复读:A、B两个事物,A事务读取了B已提交的数据,事务B再对数据进行更新,事务A两次读取到的数据不一致

  •  

    幻读:事务A按范围读取N行数据,事务B更新或新增数据,数据A再读取相同范围的数据时,与首次读取的行数不同

Mysql中有哪几种锁

参考:https://www.cnblogs.com/wenxuehai/p/15948248.html

  • 按数据的操作类型分:共享锁(S锁、读锁)、排它锁(X锁、写锁)
  • 按数据的操作粒度分:表级锁、行级锁、业级锁
  • 按数据的操作类型分::悲观锁、乐观锁

表级共享锁:读锁阻塞写,不会阻塞读

表级排它锁:写锁会阻塞其它会话的读写

悲观锁:总是假设别人会修改当前数据,所以每次读取的时候总是加锁(读写都加锁)

乐观锁:总是假设被人不会同时修改当前数据,所以每次读取的时候不会加锁,只有在更新数据的时候通过version判断数据是否被更改

行级锁:只有innoDB才有行级锁,且只有修改的条件为索引列时才会有行级锁,行级锁只锁修改,不锁查询

 索引分类有哪些?

  • 普通索引
  • 唯一索引
  • 主键索引
  • 联合索引
  • 全文索引

索引失效的情况

  • 使用like %%查询
  • 未遵循最左前缀法
  • 计算、函数、类型转换
  • 使用is null, is not null不会让索引失效
  • 使用!=
  • or前的列建立了索引,or 后的列没建索引

Mysql有哪些日志

  • undo log: 用于支持事务的原子性,用于支持事务回滚以及MVCC,记录与当前sql相反的语句,如insert对应的undolog记录为delete
  • redo log: 支持事务的持久化
  • binlog(二进制日志):记录对数据库执行更改的操作
  • realayog(中继日志)):用于从机复制主机信息
  • 查询日志:记录所有对数据库的请求信息
  • 慢查询日志:将运行时间超过阀值的sql记录在慢查询的日志文件中

binlog和redolog的区别

binlog: 是逻辑日志,记录的是这个语句的原始逻辑,即存储的是一个事务的操作,如update、update、delete操作

redolog: 是物理日志,记录了再这个数据页上做了什么修改

下图是一种典型的物理日志

 

 

我们可以看到对应的redolog日志记录的为

"Page 42:image at 367,2; before:'ke';after:'ca'"

 

posted on 2022-11-09 17:55  宇宙美少女  阅读(22)  评论(0编辑  收藏  举报

导航