0
点赞
收藏
分享

微信扫一扫

《大厂等着我》系列之MySql相关面试题总结

闲鱼不咸_99f1 2022-01-04 阅读 25

这里写自定义目录标题

《大厂等着我》系列之MySql相关面试题总结

我觉得数据库相关常问的面试题无非就这些,事务特性,隔离级别,undo log/redo log,MVCC,b树/b+树,为什么索引结构采用B+树,涉及到datePage的概念,然后索引优化,explain慢查询优化,几大索引,回表,索引下推,索引覆盖,大数量优化之分库分表,主从同步,读写分离,binlog同步ES,本期先简单列个概要,后面计划针对每一块知识点作详细介绍。

MySql事务特性(ACID)

原子性:指的是一个事务中的操作要么全部成功,要么全部失败。
一致性:数据库在事务执行前后都保持一致性状态,在一致性状态下,所有事务对一个数据的读取结果都是相同的。
隔离性:指的是一个事务的修改在最终提交前,对其他事务是不可见的。
持久性:指的是一旦事务提交,所做的修改就会永久保存到数据库中。

事务隔离级别

读未提交: 一个事务还没提交时,它做的变更就能被别的事务看到。 导致脏读、不可重复读、幻读
读已提交:一个事务提交之后,它做的变更才会被其他事务看到。 导致不可重复读、幻读
可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据
是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 导致幻读
串行化:顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
Mysql的默认隔离级别是可重复读,oracle的默认隔离级别是读已提交

undo log

原子性是基于undo log日志实现的,undo log 是逻辑日志。
解释:在操作任何数据之前,首先将数据备份到一个地方(成为undo log)。然后进行数据的修改。如果出现了错误或用户执行了Rollback语句,系统可以利用undo log中的备份将数据恢复到事务开始之前的状态。

redo log

持久性是基于redo log日志实现的,redo log是物理日志。
解释:和undo log相反,redo log 记录的是新数据的备份,在事务提交之前,将redo log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化。系统可以根据redo log的内容,将所有数据恢复到最新状态。

MVCC

MVCC多版本并发控制,指的是生成readView的时机不一样,在不同的隔离级别的情况下,读取的版本值不一样。MVCC是通过undo log来实现多版本并发控制的,在值从v1更新到v2时,在undo log日志中会记录下返逻辑操作v2到v1的操作。

A和B事务,开启事务,A事务对数据进行了更新,并提交,B事务在读已提交的隔离级别下,读取的是当前存在的最新版本的数据,导致了不可重复读;在可重复读隔离级别下,读取的是当前事务开启事务之前的最后一个版本状态

RC读已提交隔离级别,读取的是当前存在的最新版本的数据
RR可重复读隔离级别,读取的是当前事务开启之前的最后一个版本状态

索引(B树/B+树)

平衡多路查找树
在B+Tree有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有的叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

1.InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6字节的row_id来作为主键
2.如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表。

聚簇索引和非聚簇索引
数据和索引是不是存放在一起

索引覆盖 using index
select id from tb_user where name=shugeshow =====>索引覆盖
select * from tb_user where name=shugeshow ======>回表

组合索引:最左匹配原则

索引下推 using index condition
name, age
不适用索引下推的话(mysql5.6版本之前)
先根据name列的值把所有的数据都拉取到server层,在server层对age做过滤
使用索引下推(mysql5.6开始)
根据name,age两个字段把满足要求的数据拉到server层,取出对应的数据

采用了索引下推之后,可以大大减少回表次数,提升性能

唯一索引和主键索引的区别
唯一索引可以有空值,主键索引不能为空值

分库分表

sharding jdbc、myCat
主从同步、读写分离

binlog同步Es

待更新…

总结

以上内容是我经历过多家大中型互联网公司面试中常被问道的知识点,写得有些随意,先简要做个记录,由点到面,后期逐个展开。温故而知新,希望各位多多交流,喜欢的可以点个关注吖!

举报

相关推荐

0 条评论