主从复制
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 后的列没建索引