每日十题八股-2024年12月31日

1.能不能只用binlog不用relo log?
2.binlog 两阶段提交过程是怎么样的?
3.update语句的具体执行过程是怎样的?
4.mysql的explain有什么作用?
5.给你张表,发现查询速度很慢,你有那些解决方案
6.如果Explain用到的索引不正确的话,有什么办法干预吗?
7.MySQL主从复制了解吗
8.主从延迟都有什么处理方法?
9.分表和分库是什么?有什么区别?
10.讲一下Redis底层的数据结构

1.能不能只用binlog不用relo log?

bin log是 server 层的日志,没办法记录哪些脏页还没有刷盘,只适用于主从复制和数据备份。
redo log 是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复。

2.binlog 两阶段提交过程是怎么样的?

事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。因此,采取两阶段提交的方法,是为了保证两份日志之间的一致性。

bin log后写,若中途发生宕机等情况,再用bin log 进行备份,会出现主库和备份库不一致的情况。
redo log后写,同样发生意外,因为redo log没有写入,那么崩溃恢复并没有办法恢复到bin log记录的情况,这时再备份,同样出现主库和备份库不一致的情况。
在这里插入图片描述

在这里插入图片描述

3.update语句的具体执行过程是怎样的?

Client客户端:
客户端通过tcp/ip发送一条sql语句到server层。

Server层:
接收客户端过来的请求,连接器进行权限验证;
权限验证通过后,解析器会对SQL语句进行词法、语法分析等;
经过验证解析的SQL语句会在优化器生成选择最优执行计划;
然后执行器将会执行经过优化的SQL语句;

InnoDB引擎层:
调用存储引擎接口后,会先从Buffer Pool获取数据页,如果没有就从磁盘中读入Buffer Pool然后判断更新前后的记录是否一样
开启事务,修改数据之前先记录undo log,写入Buffer Pool的undo page
开始更新page data中的记录,被修改的数据页称为脏页,修改会被记录到内存中的 redo log buffer中,再刷盘到磁盘的redo log文件,此时事务是 perpare阶段(写到缓存,redo log,刷盘);
脏页不会立即写入磁盘,而是由后台线程完成,这里会用double write来保证脏页刷盘的可靠性;
还没结束呢,这时候可以通知Server层,可以正式提交数据了, 执行器记录binlog cache,事务提交时才会将该事务中的binglog刷新到磁盘中;
这个时候Update语句完成了Buffer Pool中数据页的修改、undo日志、redo log缓存记录,以及记录binlog cache缓存
commit阶段,这个阶段是将redo log中事务状态标记为commit
此时binlog和redo log都已经写入磁盘,如果触发了刷新脏页的操作,先把脏页copy到double write buffer里,Double Write Buffer 的内存数据刷到磁盘中的共享表空间 ibdata,再刷到数据磁盘上数据文件 ibd;
流程完结;

4.mysql的explain有什么作用?

explain 是查看 sql 的执行计划,主要用来分析 sql 语句的执行过程,比如有没有走索引,有没有外部排序,有没有索引覆盖等等。

5.给你张表,发现查询速度很慢,你有那些解决方案

1.分析查询语句:使用EXPLAIN命令分析SQL执行计划,找出慢查询的原因;
2.创建或优化索引,避免索引失效:根据查询条件创建合适的索引;
3.查询优化:避免使用SELECT *,只查询真正需要的列;使用覆盖索引,即索引包含所有查询的字段;
4.优化数据库表:如果单表的数据超过了千万级别,考虑是否需要将大表拆分为小表;
5.缓存:引入缓存层,如Redis,存储热点数据和频繁查询的结果。

6.如果Explain用到的索引不正确的话,有什么办法干预吗?

可以使用 force index,强制走索引。

7.MySQL主从复制了解吗?

MySQL 的主从复制依赖于 binlog ,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上。复制的过程就是将 binlog 中的数据从主库传输到从库上。
在这里插入图片描述

8.主从延迟都有什么处理方法?

强制走主库方案:对于大事务或资源密集型操作,直接在主库上执行,避免从库的额外延迟。
就是从库只起到备份作用?参考
在这里插入图片描述

在这里插入图片描述

9.分表和分库是什么?有什么区别?

一个是为了解决高并发,但数据库扛不住,一个是为了提交查询效率。
在这里插入图片描述
分库与分表可以从:垂直(纵向,按列分)和 水平(横向,按行分)两种纬度进行拆分。

10.讲一下Redis底层的数据结构?

常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值