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'"