数据库笔记
本文最后更新于:2022年8月7日 下午
数据库篇
事务
MySQL技术内幕 InnoDB
数据库为什么要引入事务?
事务可以把数据库从一种 一致状态 转换为 另一种一致状态。
在数据库提交工作时,可以确保要么所有修改都保存了,要么所有的修改都不保存。
知道事务的四大特征吗?(基础)
ACID:原子性,一致性,隔离性和持久性。
原子性 Atomicity:指整个数据库事务是不可分割的工作单位,要么全都做,要么全都不做;
一致性 consistency:指事务将数据库从一种状态转变为下一种一致的状态。
指事务执行前后,数据处于一种合法的状态;事务是一致性的单位,如果事务中某个动作失败了,
系统可以自动撤销事务————返回初始化的状态。
隔离性 isolation:隔离性也称为 并发控制、可串行化、锁等。
事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即
该事务提交前对其他事务都不可见,通常这使用锁来实现。
指并发执行的各事务之间互不影响,相互隔离;
持久性 durability:事务一旦提交,对数据库的改变是永久性的。即使发生宕机等故障,
数据库也能将数据恢复。
好,既然你知道4大特性,那你讲讲 MySQL 如何实现的呢?
事务的一致性的如何保证的?(追问)
- 数据库层面:通过原子性,隔离性和持久性来保证的,原子性、隔离性和持久性是手段,
一致性是目的。 - 应用层面:通过判断数据是否符合业务规则、数据库操作是否报错,是否符合预期等,来决定
是回滚事务 or 提交事务来满足一致性要求。
事务的隔离性由锁来实现。原子性、一致性、持久性通过数据库的 redo log 和 undo log 来完成。
- redo log 称为重做日志,用来保证事务的持久性。
- undo log 是回滚日志,用来保证事务的原子性。作用是帮助事务回滚和实现MVCC。
MySQL三大日志(binlog、redo log和undo log)的作用了解吗?
精讲 MySQL 事务日志:redo log 和 undo log
事务的原子性是如何保证的呢?
undo log 是实现原子性的关键。
undo log 是回滚日志,当事务执行到一半失败时,撤销所有已经成果执行的SQL语句,需要
回滚日志的信息,利用 undo log 中的信息将数据回滚到修改之前的样子。
一条查询语句的执行流程?
一条更新语句的执行流程?
更深
MySQL索引
能讲讲 MySQL 中有哪些索引类型吗?
索引类型分为几个维度。
一种叫聚簇索引,是物理索引,数据表就是按顺序存储的,物理上是连续的;
还有一种叫非聚簇索引。
从物理存储角度,分为聚簇索引和非聚簇索引。吧啦吧吧…
从可见性角度,分为可见索引和非可见索引。巴拉巴拉…主键是聚簇索引吗?
如果创表时没有手动指定主键还有聚簇索引吗?
如果有多个唯一索引选择哪个作为聚集索引?
MySQL 为什么使用 B+ 树来作索引,对比 B 树它的优点和缺点是什么?
优点:
多叉搜索树,每个非叶子节点放的索引数量更多,树的高度更低,查找某个叶子节点的数据所要进行的IO次数就更少。
使用B+树,在大数据量的情况下,进行范围查找的效率更高,把数据都放在叶子节点,叶子节点直接使用双向链表进行链接,方便范围查找。
缺点:
不管查询什么数据,都要下到叶子节点才能得到数据;对于数据量较少的情况,使用B树效率更高,因为B树的数据和索引是放在一起的,不用非要下到叶子节点才能得到数据。
数据库的事务隔离级别有哪些?各有哪些优缺点?
https://zhuanlan.zhihu.com/p/117476959
Redis
缓存雪崩 缓存击穿 缓存穿透
- 缓存雪崩:大量key同时失效;【随机设置key过期时间】【熔断机制】【数据库容灾能力,分库分表,读写分离】【Redis集群】
- 缓存击穿:某一热点key突然失效;【热点key不设置过期时间】【互斥锁,获取锁才能访问数据库】
- 缓存穿透:大量不存在于Redis中的key,穿过了缓存,打在了数据库上。【使用布隆过滤器】
https://zhuanlan.zhihu.com/p/346651831
布隆过滤器
作用:
如果某个key不存在,那就一定不存在;如果某个key存在,那么很大可能是存在(有一定的误判率);
在缓存前加一层布隆过滤器,如果判断key一定不存在,就直接返回;如果判断key存在,再查Redis和数据库。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!