20230321 学习总结
MySQL
-
MySQL的几种锁:7种锁的详解
-
行级锁和表级锁:InnoDB支持行级锁,而MyIsam只支持表级锁
-
乐观锁和悲观锁?
-
悲观锁:悲观锁(Pessimistic Lock): 就是很悲观,每次去拿数据的时候都认为别人会修改。所以每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放,悲观锁中的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程
但是在效率方面,处理加锁的机制会产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,如果已经锁定了一个线程A,其他线程就必须等待该线程A处理完才可以处理
数据库中的行锁,表锁,读锁(共享锁),写锁(排他锁),以及syncronized实现的锁均为悲观锁
-
乐观锁:乐观锁(Optimistic Lock): 就是很乐观,每次去拿数据的时候都认为别人不会修改。所以不会上锁,但是如果想要更新数据,则会在更新前检查在读取至更新这段时间别人有没有修改过这个数据。如果修改过,则重新读取,再次尝试更新,循环上述步骤直到更新成功(当然也允许更新失败的线程放弃操作),乐观锁适用于多读的应用类型,这样可以提高吞吐量
相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本(version)或者是时间戳来实现,不过使用版本记录是最常用的。
-
-
读锁和写锁:
- 读锁:s锁
- 写锁:x锁
-
记录锁:记录锁是最简单的行锁,仅仅锁住一行。如:
SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE
,如果C1字段是主键或者是唯一索引的话,这个SQL会加一个记录锁(Record Lock) -
间隙锁:为了解决幻读问题,InnoDB引入了间隙锁
(Gap Lock)
。间隙锁是一种加在两个索引之间的锁,或者加在第一个索引之前,或最后一个索引之后的间隙。它锁住的是一个区间,而不仅仅是这个区间中的每一条数据。 -
临键锁:Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。说得更具体一点就是:临键锁会封锁索引记录本身,以及索引记录之前的区间,即它的锁区间是前开后闭,比如
(5,10]
。 -
####意向锁(表级锁):
InnoDB中的读锁和写锁既可以作用于表级锁也可作用于行级锁,当假如有一个行级排他锁,再来一个表级共享锁的时候,InnoDB就会每一行判断是都有排他锁,这样效率很低。所以引入了意向锁,当加入一个行级排他锁时,就会给该表加上一个表记意向排他锁。
- IS意向共享锁
- IX意向排他锁
-
自增锁
-
插入意向锁?
-
-
MySQL中的几种事务隔离等级
-
读未提交
-
读提交
-
可重复读 InnoDB默认支持的隔离等级
-
串行化
-
-
MySQL中引擎:
- InnoDB
- MyIsam
-
两种引擎的区别和相同点:
- 区别:
- InnoDB支持行级锁,InnoDB支持事务,InnoDB支持MVCC,InnoDB支持外键,支持数据库崩溃后的安全恢复(基于redo log)
- MyIsam仅支持表级锁,MyIsam不支持事务,不支持外键,不支持数据库异常崩溃后的安全恢复
- 相同点
- 区别:
-
####脏读、不可重复读、幻读:
- 脏读:事务2读到了事务1已经修改的数据。一个事务读取数据并且对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据,这也就是脏读的由来。
- 不可重复读:指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- 幻读:多用于统计行数的时候,事务1加入或删除了某条数据,导致事务2读到的行数不准确。幻读与不可重复读类似。它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
-
日志
- redo log:引擎级别,InnoDB支持,MyIsam不支持
- undo log
- bin log
-
InnoDB和MyIsam在底层存储之间的区别:(都用B+树作为索引结构,但是两者的实现方式不一样)
两者引擎底层都是B+树实现的,只不过采用InnoDB引擎的主键索引是采用了聚集索引。MyIsam不管是否是主键都采用的非聚集索引。
二级索引(辅助索引)属于非聚集索引。二级索引的叶子节点存储的数据是主键。
在MyISAM中,B+树叶子结点的data域存储的是数据记录的地址。
在InnoDB中,B+树叶子节点的data域存储的是完整的数据记录。这个索引的key是数据表的主键。
聚集索引和非聚集索引的区别是:前者索引结构和数据存放在一起的
-
采用B树和B+树的区别:
- B树的所有节点(叶子节点和非叶子节点)保存着数据,而B+树的非叶子节点没有保存数据,仅存在着索引,叶子节点中保存数据
- B+树的叶子节点有一条引用链指向它相邻的叶子节点
- B树的检索过程相当于对于范围内的每个节点的关键字都做二分查找,可能还没有查找到叶子节点,检索就结束了。而B+树必须检索到叶子节点,检索效率更稳定
-
覆盖索引
-
联合索引
-
索引下推
-
最左前缀匹配原则
-
按照应用维度对索引进行划分:
- 主键索引:列值唯一不重复,且没有null
- 唯一索引:列值唯一不重复,可以有null
- 普通索引:列值可以重复,也可以有null
- 覆盖索引
- 联合索引
- 全文索引
- 不使用索引
-
事务的ACID:
- A:原子性:事务要么全部执行,要么全部不执行。不允许分割
- C:一致性:保证事务得到的结果,在事务执行前后是一致的
- I:隔离性:事务具有隔离性,不同的事务不会相互影响
- D:持久性:一个事务被提交后,他对于数据库的数据改变是持久的